看看这个片段:
var obj = {
fn: function () {return this;}
};
var x = obj.fn;
obj.fn(); // returns obj
x(); // returns window (in the browser)
我很好奇为什么obj.fn()
和x=obj.fn; x()
不同。在一个表达式中直接跟随函数调用的属性查找是否存在特殊情况,或者是否存在一些更复杂的魔术(比如Python中的描述符协议)?
this
上下文变量的值始终取决于函数的调用方式。
obj.fn();
将调用函数作为method
,这意味着它的this
值将始终引用包含的对象,在本例中为obj
。
通过直接在x
中存储引用,函数在全局范围中被称为"就像那样",这意味着它在非ES5严格模式环境中总是引用global object
,在ES5严格方式中它将是undefined
。
因此,在引用变量中的对象方法时总是需要小心。如果这样的方法想通过this.someProp
从它自己的对象访问一些数据,那么如果this
绑定到另一个对象/上下文,它显然会失败。
免责声明:"将始终引用包含的对象"并不完全正确。如果函数通过Function.prototype.bind()
绑定到另一个对象,它将始终引用该绑定对象