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

n0m*_*rcy 5 javascript this

为什么在javascript中如果将对象方法引用到某个变量,则会丢失该对象上下文.无法找到任何链接,解释引擎盖下发生的事情.除了这个说明: 'this'指的是'拥有'不接缝为真的方法的对象.

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)
Run Code Online (Sandbox Code Playgroud)

Ian*_*ark 3

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

JavaScript 的上下文与许多语言不同,您可以使用 或 轻松覆盖.call().apply()。此外,ECMAScript 5 引入了一种新.bind()方法,允许您创建始终绑定到相同上下文的方法的副本。请参阅 MDN 了解更多信息

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;
Run Code Online (Sandbox Code Playgroud)