手机版

JavaScript中对此的全面分析和常见示例

时间:2021-08-24 来源:互联网 编辑:宝哥软件园 浏览:

前言

这个关键字在Javascript中非常常见,但是很多开发人员很难确切知道它指向什么。大多数人会从字面上理解这一点,并认为这指向函数本身。事实上,这是在运行时绑定的,而不是在编写时绑定的,其上下文取决于调用函数时的各种条件。这个的绑定与函数声明的位置无关,只取决于函数的调用方式。

总结当调用:函数时会发生这种绑定,这指向什么完全取决于调用函数的位置。

首先,这方面的约束规则

这总共有4个约束规则。接下来,我们将逐一介绍每个规则的解释以及规则的直接优先级

默认绑定(严格/宽松模式)隐式绑定显式绑定新绑定1.1默认绑定(严格/宽松模式)

独立函数调用:这在调用独立函数时使用默认绑定规则,并且这指向默认绑定规则下的window(全局对象)。在严格模式下:这不能使用默认绑定,这将被绑定到undefined。独立函数调用

function foo(){ console . log(this . a);} var a=2;foo();//2在严格模式下:

function foo() { '使用strict ';console.log(此);//未定义的console . log(this . a);//未捕获类型错误:无法读取未定义{ var a=2 }的属性“a ”;foo();注意以下两种情况

var age=' 18var obj={ name: 'heyushuo ',age: 25,fn : function(){ function sayName(){ console . log(this);//window console . log(this . age);//undefined } SayName();}};obj . fn();函数sayName是在obj.fn内部定义的,但它仍然是一个独立的函数调用,这仍然指向window。

var a=' globalvar obj={ a: 2,foo : function(){ console . log(this . a);//全局} };var bar=obj.foo//函数别名!bar();虽然bar是obj.foo的引用,但实际上它引用的是函数本身,所以bar()实际上是一个独立的函数调用,没有任何修改,所以应用了默认绑定。

1.2隐式绑定

当函数引用上下文对象时(例如,obj.foo此时使用obj上下文引用函数foo),隐式绑定规则会将函数中的这个绑定到这个上下文对象。

var obj={ name: 'heyushuo,foo : function(){ console . log(this . name);//heyushuo } };obj . foo();只有对象属性引用链中的上层或最后一层在调用中起作用。

var obj={ name: 'heyushuo ',obj1: { name: '毕克',foo : function(){ console . log(this . name);//毕克} } };obj . obj 1 . foo();隐性损失

隐式绑定的函数会丢失绑定的对象,但应用默认绑定将其绑定到全局对象或未定义(严格模式)。

第一种

var a=' globalvar obj={ a: 2,foo : function(){ console . log(this . a);//全局} };var bar=obj.foo//函数别名!bar();虽然bar是obj.foo的引用,但实际上它引用的是函数本身,所以bar()实际上是一个独立的函数调用,没有任何修改,所以应用了默认绑定。

第二,传入回调函数时:

var a=' globalvar obj={ a: 2,foo : function(){ console . log(this . a);//全局} };var bar=obj.foo//函数别名!函数DoFoO(fn){ fn();//-呼叫位置!}doFoo(酒吧);//global//setTimeout(obj.foo,300)与下面的相同;1.3显示绑定

请使用call()或apply()方法。第一个参数是一个对象,它在调用函数时绑定到这个对象,这个函数称为显示绑定。

function foo(){ console . log(this . a);} var obj={ a: 2 }foo . call(obj);//2显示硬绑定是从绑定派生的,代码如下

function foo(某物){ console.log(this.a,某物);归还这个。}//简单辅助绑定函数functionbind (fn,obj) {return function () {return fn。运用(物体、论据);//此处传入函数的指针已被内部强制绑定};} var obj={ a:2 }var bar=bind(foo,obj);var b=bar(3);//2 3 con sole . log(b);//5bar函数将始终手动调用obj上的fn,通过强制将fn的这个值绑定到obj上。这也解决了前面提到的绑定丢失的问题。因为硬绑定是一种非常常见的模式,所以在ES5中提供了内置的方法Function.prototype.bind

function foo(某物){ console.log(this.a,某物);归还这个。} var obj={ a:2 }var bar=foo . bind(obj);var b=bar(3);//2 3 console . log(b);//51.4新绑定

当使用new调用函数时,或者当发生构造函数调用时,将自动执行以下操作。

创建一个全新的对象。这个新对象将由[[原型]]连接。这个新对象将绑定到这个函数调用。如果函数不返回另一个对象,新表达式中的函数调用将自动返回这个新对象。例如:

function foo(){ this . name=' heyushuo ';this . age=25 } foo . prototype . SayName=function(){ console . log(this . name this . age);} var bar=new foo();console . log(bar);//{name:' heyushuo ',age : 25 }//这个新对象将绑定到这个由函数调用的。因此,这是bar对象console . log(bar . age);//25下图显示了对象new foo()

二、四种绑定关系的优先级

要判断这一点,可以按以下顺序判断:

1.函数是否在new(新绑定)中调用?如果是,这将绑定到新创建的对象。

Var bar=new foo()2。函数是通过调用、应用(显式绑定)还是硬绑定调用的?如果是,这将绑定到指定的对象。

Var bar=foo.call(obj2)3。该函数是否在上下文对象中调用(隐式绑定)?如果是这样,这将绑定到该上下文对象。

Var bar=obj1.foo()4。如果没有,请使用默认绑定。如果在严格模式下,绑定到undefined,否则绑定到全局对象。

var bar=foo()的摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。

版权声明:JavaScript中对此的全面分析和常见示例是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。