Javascript执行上下文

时间:2015-10-05 06:38:12

标签: javascript

您好我在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在函数调用之后。

如果这令人困惑,我感到非常抱歉,但如果有人能帮助我,那将会很有帮助!谢谢!

2 个答案:

答案 0 :(得分:3)

  

我遇到的问题是,在全局执行上下文中,将在此上下文的创建阶段到达最后一行(var d),或者它将永远不会到达,因为var d在函数调用之后。

关于JavaScript的一个关键问题是var是“悬挂的”。这意味着var声明在之前发生任何分步代码。因此,代码运行的顺序是:

  1. 创建函数a,不要运行它。

  2. 创建函数b不要运行它

  3. 使用值d创建全局变量undefined

    现在我们开始逐步执​​行全局代码。

  4. 运行函数a

    1. 为此a

    2. 的调用创建执行上下文
    3. 在该上下文中使用值c创建局部变量undefined

    4. 运行函数b

      1. 为此b

      2. 的调用创建执行上下文
      3. 在该上下文中使用值d创建本地变量undefined

      4. 销毁对b

      5. 的调用的执行上下文
    5. 销毁对a

    6. 的调用的执行上下文
  5. 请注意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>