Javascript 在分配给其他变量时丢失了上下文

标签 javascript this

为什么在 javascript 中,如果您将对象方法引用到某个变量,它会丢失该对象上下文。找不到任何链接来解释引擎盖下发生的事情。除了这个声明: ‘this’ refers to the object which ‘owns’ the method这似乎不是真的。

var Class = function() {
    this.property = 1
}

Class.prototype.method = function() {
    return this.property;
}

var obj = new Class();
console.log(obj.method() === 1);

var refToMethod = obj.method; // why refToMethod 'this' is window


console.log(refToMethod() !== 1) // why this is true?

var property = 1;
console.log(refToMethod() === 1)

最佳答案

这取决于函数的调用方式。如果函数不是通过对象的属性(例如 refToMethod)来引用的,那么它将被分配到“全局上下文”,即 window。但是,当函数是对象的属性时(例如 obj.method),我们将其称为方法,并隐式为其父对象分配上下文。

JavaScript 的上下文不同于许多语言,因为您可以使用 .call() 轻松覆盖它。或 .apply() .此外,ECMAScript 5 引入了一个新的 .bind()方法允许您创建始终绑定(bind)到相同上下文的方法的副本。 See MDN for more .

var obj = new Class();
obj.method(); // 1;

var unbound = obj.method;
unbound(); // undefined;

// Call and Apply setting the context to obj.
unbound.apply(obj); // 1
unbound.call(obj); // 1;

// ECMAScript 5's bind
var bound = unbound.bind(obj);
bound(); // 1;

关于Javascript 在分配给其他变量时丢失了上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23154778/

相关文章:

javascript - 添加事件调用其他方法的方法

android - EnableListAdapter 中的上下文

javascript - 重构 jQuery $(this).find

javascript - 如何制作仅捕获一个符号但有限制的正则表达式?

javascript - Google Maps API 未显示引导元素和固定导航栏

javascript - 为什么将一个函数(属于一个对象)分配给一个变量会有这样的行为?

Javascript 绑定(bind)与其实例一起使用

javascript - 计算两个 Jquery 日期选择器之间的周数

javascript - JavaScript 对象中的这个 "get"是什么意思?

c++ - 在模板派生类中,为什么我需要在成员函数内使用 "this->"限定基类成员名称?