第二次函数调用不是从对象的上下文中发生的,而是从第一次调用返回的函数中发生的。
因为没有对象上下文,所以该值就像任何其他函数一样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
函数调用的值。