看一下这段代码:
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中的描述符协议)?
this
上下文变量的值始终取决于函数被调用时的方式。
obj.fn();
将函数作为方法
调用,意味着其this
值将始终引用包含该函数的对象,即obj
。
通过直接在x
中存储引用,函数在全局范围内会被"随便调用",这意味着它总是会在非 ES5-strict 模式环境下引用全局对象
,并且在 ES5 strict 模式下它将是未定义的
。
因此,在引用对象方法变量时总是需要小心。如果这样的方法想要通过this.someProp
访问其自身对象中的一些数据,如果this
被绑定到另一个对象/上下文,那么它显然会失败。
免责声明:"will always reference the containing object"不完全正确。如果通过Function.prototype.bind()
将函数绑定到另一个对象上,它将始终引用该绑定对象。