在这些代码中,如何使用执行上下文解释输出结果?

时间:2019-04-12 11:26:54

标签: javascript executioncontext

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

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

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

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

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

或者有什么更好的方法来解释为什么这里的结果是undefined?我在网上搜索过,看到有人说这是因为起吊。对吗?

1 个答案:

答案 0 :(得分:1)

这是因为您无需分配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。