var obj={
            say: function(){
                console.log(obj); // undefined
            }()
        };


最终输出undefined。我开始使用执行上下文的知识对其进行解释,但是我对何时在上下文中创建该方法感到怀疑。

我知道进入上下文后,我们首先进入创建阶段,并创建一个包含变量和函数声明的变量对象。接下来,我们进入执行阶段,并完成varibale和function的分配。因此,在此示例中,我们:

首先,进入全局执行上下文的创建阶段,objundefined
接下来,在创建阶段之后,我们进入执行阶段。代码开始执行,obj现在指向一个对象。但是,在上述过程中,say方法是何时创建的?执行还是全局执行的执行阶段?

(如果在创建阶段,则全局执行上下文的变量对象应为AO={ obj:undefined,say: referencce to <function>}

还是有更好的方法来解释为什么结果为undefined?我在网上搜索,发现有人说这是因为起吊。对吗?

最佳答案

这是因为您无需分配obj的值即可立即调用该函数。比较底部代码段中的两种情况:



var obj = {
  say: function() {
    console.log(obj); // Not undefined since it will run after obj is assigned
  }
};
obj.say();

var objUndef = {
  say: function() {
    console.log(objUndef); // undefined
  }() // <--- immediately calling
};




在您的示例中,您没有分配函数,而是分配了函数的结果(因为您立即用()调用了它),该结果在分配obj之前就已运行。因此,结果是您未定义登录到控制台,而不是obj值。如果首先创建对象,然后使用obj.say()调用其say方法,则将定义obj,因为在尝试调用obj之前先分配了obj。

10-05 22:46
查看更多