Javascript:obj.fn()vs x=obj.fn;x()
请看以下片段:Javascript:obj.fn()vs x=obj.fn;x(),javascript,Javascript,请看以下片段: 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中的情况)?来自此上下文变量的值始终取决于函数
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中的情况)?来自此
上下文变量的值始终取决于函数的调用方式
obj.fn();
将调用函数作为方法
,这意味着其此
值将始终引用包含的对象,在本例中为obj
通过将引用直接存储在x
中,该函数在全局范围内称为“就像那样”,这意味着在非ES5严格模式环境下,它将始终引用全局对象
,在ES5严格模式下,它将是未定义的
因此,在变量中引用对象方法时,始终需要小心。如果这样的方法希望通过this.someProp
从自己的对象访问某些数据,那么如果this
绑定到另一个对象/上下文,则显然会失败
免责声明:“将始终引用包含对象”并不完全正确。如果函数通过
function.prototype.bind()
绑定到另一个对象,它将始终引用该绑定对象。@Tim Down:谢谢,我自己还没有找到。不幸的是,该规范的可读性有一个缺陷。。埃克姆。。质量有问题:)无论如何,很遗憾,属性查找和调用运算符的组合给出的结果与单独使用它们不同。