Javascript: obj.fn() vs x=obj.fn;x()

Javascript: obj.fn() vs x=obj.fn;x()

本文关键字:fn obj vs Javascript      更新时间:2023-09-26

看看这个片段:

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()绑定到另一个对象,它将始终引用该绑定对象