有人可以解释这背后的概念吗?
假设我们有一个函数作为对象的方法:
var myobj = {
myfunc : function () {
console.log(this); // Logs reference to myobj.
}
};
myobj.myfunc();
而同一函数myfunc
内的嵌套函数将返回对头对象(窗口)的引用:
var myobj = {
myfunc : function () {
( function (){
console.log(this); // Logs reference to head window object.
})();
}
};
myobj.myfunc();
这真的让我感到困惑,因为我认为函数将始终返回对父对象的引用。
问题是,这是一个固定的规则,即任何嵌套函数总是会引用window
吗?
答案 0 :(得分:2)
函数内this
的值取决于它的调用方式,而不是它的定义方式
当您在myobj
范围内调用该函数时,myobj
将是this
myobj.myfunc();
当您调用没有执行上下文的函数时,this的值将是全局对象,在本例中为window
。
function test() {
console.log(this); // window
}
test(); // global context
创建IIFE时,执行上下文是窗口,因为没有设置其他上下文
( function (){
console.log(this); // window
})();
然后有apply
,call
和bind
,可让您为被调用的函数设置另一个值this
。
答案 1 :(得分:2)
我担心正确答案如下(经过2小时的搜索),本书"JavaScript Succinctly"表明:
你可能想知道在里面使用它会发生什么 包含在另一个函数内的函数。坏消息 在ECMA 3中,它失去了它的方式并指向头部物体( 浏览器中的窗口对象),而不是其中的对象 功能已定义。
它还声明:
好消息是,这将在ECMAScript 5中修复。现在,你 应该意识到这种困境,尤其是当你开始过世时 作为其他函数的值运行。
如此简单的答案是YES,任何嵌套函数总是返回head对象作为参考。
此外,您可以使用解决方法来解决此问题,方法是尽快存储this
的值,如下所示:
var myObject = {
myProperty: 'I can see the light',
myMethod : function() {
var that = this; // Store a reference to this (i.e. myObject) in myMethod scope.
var helperFunction = function() { // Child function. // Logs 'I can see the light' via scope chain because that = this.
console.log(that.myProperty); // Logs 'I can see the light'.
console.log(this); // Logs window object, if we don't use "that".
}();
}
};
myObject.myMethod(); // Invoke myMethod.