为什么在 javascript 中,如果您将对象方法引用到某个变量,它会丢失该对象上下文。找不到任何链接来解释幕后发生的事情。除了这一篇指出:“this”指的是“拥有”该方法的对象 http://www.sitepoint.com/what-is-this-in-javascript/这似乎不是真的。
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() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call or .apply() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply。此外,ECMAScript 5 引入了新的.bind() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind方法允许您创建始终绑定到相同上下文的方法的副本。请参阅 MDN 了解更多信息 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this.
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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)