var foo = (() => this); // 接着上面的代码 // 作为对象的一个方法调用 var obj = {foo: foo}; console.log(obj.foo() === window); // true // 尝试使用call来设定this console.log(foo.call(obj) === window); // true // 尝试使用bind来设定this foo = foo.bind(obj); console.log(foo() === window); // true
【无论如何,foo
的 this
被设置为他被创建时的上下文(在上面的例子中,就是全局对象)】
这同样适用于在其他函数内创建的箭头函数:这些箭头函数的 this
被设置为封闭的词法上下文的。
当函数作为对象里的方法被调用时,它们的
this
是调用该函数的对象
this
的绑定只受最靠近的成员引用的影响。在下面的例子中,我们把一个方法 g
当做对象 o.b
的函数调用。在这次执行期间,函数中的 this
将指向 o.b
。事实证明,这与他是对象 o
的成员没有多大关系,最靠近的引用才是最重要的。
o.b = { g: independent, prop: 42 } console.log(o.b.g())
对于在对象原型链上某处定义的方法,同样的概念也适用。如果该方法存在于一个对象的原型链上,那么 this
指向的是调用这个方法的对象,就像该方法在对象上一样。
var o = { f: function() { return this.a + this.b; } }; var p = Object.create(o); p.a = 1; p.b = 4; console.log(p.f()); // 5
在这个例子中,对象