`这个`in嵌套函数是全局对象

`This` in nested function is global object

本文关键字:全局 对象 嵌套 这个 in 函数      更新时间:2023-09-26

有人能解释一下这背后的概念吗?

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

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

函数内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

我担心正确的答案如下(经过2个小时的搜索),这本书《JavaScript简洁》指出:

你可能想知道当它在包含在另一个函数内部的函数。坏消息在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.