JavaScript:obj.fn()与x = obj.fn;x()的区别

3

看一下这段代码:

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中的描述符协议)?

1个回答

6

this 上下文变量的值始终取决于函数被调用时的方式。

obj.fn();

将函数作为方法调用,意味着其this值将始终引用包含该函数的对象,即obj

通过直接在x中存储引用,函数在全局范围内会被"随便调用",这意味着它总是会在非 ES5-strict 模式环境下引用全局对象,并且在 ES5 strict 模式下它将是未定义的

因此,在引用对象方法变量时总是需要小心。如果这样的方法想要通过this.someProp访问其自身对象中的一些数据,如果this被绑定到另一个对象/上下文,那么它显然会失败。


免责声明:"will always reference the containing object"不完全正确。如果通过Function.prototype.bind()将函数绑定到另一个对象上,它将始终引用该绑定对象。


@Tim Down:谢谢,我自己没有发现。不幸的是,该规范的可读性有点...咳咳...质量可疑 :) 无论如何,组合属性查找和调用运算符与分别使用它们给出不同的结果真是遗憾。 - Tomasz Zieliński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接