var obj={
say: function(){
console.log(obj); // undefined
}()
};
最终输出undefined
。我开始使用执行上下文的知识对其进行解释,但是我对何时在上下文中创建该方法感到怀疑。
我知道进入上下文之后,我们首先进入创建阶段,并创建一个包含变量和函数声明的变量对象。接下来,我们进入执行阶段并完成varibale和function的分配。因此,在此示例中,我们:
首先,进入全局执行上下文的创建阶段,obj
是undefined
。
接下来,在创建阶段之后,我们进入执行阶段。代码开始执行,obj
现在指向一个对象。但是,在上述过程中,say
方法被创建了吗?全局执行的创建阶段还是全局执行的执行阶段?
(如果在创建阶段,则全局执行上下文的变量对象应为AO={ obj:undefined,say: referencce to <function>}
)
或者有什么更好的方法来解释为什么这里的结果是undefined
?我在网上搜索过,看到有人说这是因为起吊。对吗?
答案 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。