您好我在javascript中理解执行上下文概念时遇到了一些麻烦。
我有这个简单的代码:
func a(){
b();
var c;
}
func b(){
var d;
}
a();
var d;
首先,全局执行上下文将放在执行堆栈上。在此上下文的创建阶段,func a,func b和var d将被放入内存中。但var d将设置为undefined。然后它将进入此全局执行上下文中的执行阶段并调用函数a,即a()行。
在创建阶段,它会将var放入mem并将其值设置为undefined,然后逐行运行直到命中b()行。
然后b在执行堆栈上创建一个新的上下文,并在其创建阶段将var d放入mem并将其值设置为undefined。然后,当b完成运行其代码行(var d)时,它将返回到完成a,因为当func b完成其执行上下文时将弹出堆栈,所以现在当前上下文是a。
然后var c已经在函数a的内存中创建了所以现在func a的执行上下文将从堆栈弹出,它将到达最后一行var d,但是已经在执行阶段声明了全局执行上下文。
我遇到的问题是,在全局执行上下文中,将在此上下文的创建阶段到达最后一行(var d),或者它将永远不会到达,因为var d在函数调用之后。
如果这令人困惑,我感到非常抱歉,但如果有人能帮助我,那将会很有帮助!谢谢!
答案 0 :(得分:3)
我遇到的问题是,在全局执行上下文中,将在此上下文的创建阶段到达最后一行(var d),或者它将永远不会到达,因为var d在函数调用之后。
关于JavaScript的一个关键问题是var
是“悬挂的”。这意味着var
声明在之前发生任何分步代码。因此,代码运行的顺序是:
创建函数a
,不要运行它。
创建函数b
不要运行它
使用值d
创建全局变量undefined
。
现在我们开始逐步执行全局代码。
运行函数a
:
为此a
。
在该上下文中使用值c
创建局部变量undefined
。
运行函数b
:
为此b
。
在该上下文中使用值d
创建本地变量undefined
。
销毁对b
。
销毁对a
请注意d
中的局部变量b
会影响该上下文中的全局变量,但根本不会影响它。在这种背景之外,全球d
仍在那里。
答案 1 :(得分:2)
@ T.J。拥挤已经回答了这个问题,我只想添加一个有助于理解的片段:
db.collection.update(
{ "_id": 1 },
{
"$inc": {
"seats.1": 1,
"seats.2": 1,
"seats.3": 1
}
}
);
在对b()的第一次调用中,d已经创建,但未初始化,因为变量的创建是在执行阶段之前创建的,但变量的初始化是在执行阶段进行的。
第二次调用b(),是在初始化d之后,所以值5正确显示。
<html>
<script type="text/javascript">
b(); // d==undefined, b is already fine.
function b()
{
alert("d:" + d);
}
var d = 5; //Here value 5 is asigned to the already existing d variable.
b(); // d==5
c(); //That is WRONG: c is undefined.
var c = function(){alert("hello");};
</script>
</html>