[英]“this” context output not able to understand
我很难理解下面的代码。
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
var a = 4;
obj.foo();
setTimeout( obj.foo, 100 );
setTimeout( obj.foo.bind(obj), 100 );
它的输出为2,4,4,我无法理解。
第一种情况,
obj.foo();
当this
内foo
将指向obj
,因为您已经分配的功能为特定对象的属性。
第二种情况,
setTimeout( obj.foo, 100 );
在setTimeout中,传递的函数将在窗口的上下文中进行eval
。 所以这里var a = 4;
在窗口的上下文中执行并成为窗口的属性。 当在函数foo
访问this
时,这将指向此特定情况下的window
。
第三种情况,
setTimeout( obj.foo.bind(obj), 100 );
你只需绑定的obj
因为this
给函数foo
。 即使在窗口的上下文中评估函数,也不会更改绑定this
值。 这是bind
功能背后的规则。 所以this
不会从obj
变成window
。
this
关键字在差异上下文中的行为略有不同。
在全局执行上下文中(在任何函数之外),这指的是全局对象,无论是否处于严格模式。
在函数内部,其值取决于函数的调用方式。
function foo() {
console.log(this)
}
在非严格模式下, this
将默认为全局对象
在严格模式下, this
将默认为undefined
call
或apply
function foo() {
console.log(this)
}
var o = {'name': 'test object'};
foo.call(o) // log object `o`
this
可以使用call或apply方法绑定到调用中的特定对象。
bind
bind
方法返回一个函数,该函数使用特定对象通过bind
作为函数中的this
对象。
function foo() {
console.log(this)
}
var o = {'name': 'test object'};
bar = foo.bind(o)
bar() // log object `o`
有关更多信息,请参阅此链接: https : //developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this
在这种情况下obj.foo();
this
功能的foo
是obj
,所以this.a
参考obj.a
在这种情况下setTimeout( obj.foo, 100 );
obj.too
是函数foo
的引用。 setTimeout
将在全局上下文中执行它。
在这种情况下setTimeout( obj.foo.bind(obj), 100 );
, obj.foo.bind(obj)
返回到结合函数的引用this
与obj
。 setTimeout
将在obj
上下文中执行它
尝试发出alert(this);
在foo()方法里面了解上下文。
obj.foo();
=>在对象上下文中运行,因此结果将是值a
内部obj
=> 2
setTimeout( obj.foo, 100 );
=>在窗口上下文中运行, var a = 4
在窗口上下文中, this.a
给出4( this
是window
)
并且最后一行将再次具有对象context => 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.