让我们先看代码
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
结果是"The Window"
;
我想知道每一步都发生了什么。
我认为this
指向调用此函数的对象;对?
但在这种情况下,为什么this
是window
答案 0 :(得分:1)
第二个函数调用不是从对象的上下文中发生的,而是从第一次调用返回的函数中发生的。
因为没有对象上下文,this
值就像任何其他函数一样成为默认值window
。
// v-----------------v------function has context
alert(object.getNameFunc()());
// -----------^----second function was returned from the first
// and invoked so there's no object context
如果我们将返回的函数分配给object
,然后从该上下文调用它,this
则会引用object
。
obj.foo = object.getNameFunc();
obj.foo(); // "My Object"
同样精确的函数,但现在它是作为object
的属性调用的,它隐式地将其this
值设置为object
。
this
的规则非常简单易懂,但可能不是您最初的期望。
this
值非常动态,完全基于如何调用函数。
foo(); // 'this' is 'window'
object.foo(); // 'this' is 'object'
foo.call(object); // 'this' is 'object'
foo.apply(object);// 'this' is 'object'
var bar = foo.bind(object);
bar(); // 'this' is 'object'
因此,在调用函数时,如果没有与另一个对象的任何连接,您可以看到默认值为window
。
但是当我们将函数作为对象的属性调用时,this
突然引用该对象。
或者,我们可以使用.call
,.apply
或.bind
手动设置函数调用的this
值。
答案 1 :(得分:1)
由于它是一个新的闭包,this
的含义丢失了。 this
一直是一个棘手的事情,所以我更喜欢始终使用var that = this
启动这样的函数,以确保闭包内的意义不会丢失。