嵌套函数中的`this`是全局对象

时间:2014-08-27 14:20:48

标签: javascript object nested-function

有人可以解释这背后的概念吗?

假设我们有一个函数作为对象的方法:

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吗?

2 个答案:

答案 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
})();

然后有applycallbind,可让您为被调用的函数设置另一个值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.