Javascript引擎如何处理条件语句和循环中的代码?

时间:2018-02-13 07:11:05

标签: javascript v8

我知道Javascript创建全局执行上下文并将它们放在执行堆栈上并经历两个阶段,创建阶段和执行阶段,在第二阶段,当它发现正在调用的函数时,它会创建另一个执行上下文并将其放入执行堆栈顶部的执行上下文,并重复相同的事情,一旦函数中的代码完成执行,它弹出堆栈顶部,返回到堆栈下面的执行上下文。 但我的问题是Javascript如何处理条件语句或循环的代码块?

if (true) {
  //this is not the right way to write code.

  var var1 = 1;
  var var2 = 2;
  var3 = 3;

  function someFunction(arg1, arg2) {
    //code
  }
  someFunction('value1', 'value2');
}

当Javascript引擎进入条件语句或循环的代码块时,它是否会做同样的事情? 它实际上是做什么的?

3 个答案:

答案 0 :(得分:1)

使用varfunction声明的变量具有函数作用域,而不是块作用域。所以,如果你写:

function foo() {
    if (true) {
      //this is not the right way to write code.

      var var1 = 1;
      var var2 = 2;
      var3 = 3;

      function someFunction(arg1, arg2) {
        //code
      }
      someFunction('value1', 'value2');
    }
}

变量声明被提升到函数的顶部。但是,在代码流程中出现的分配仍然完成。就像你写的一样。

function foo() {
    var var1, var2, someFunction;
    if (true) {
      //this is not the right way to write code.

      var1 = 1;
      var2 = 2;
      var3 = 3;

      someFunction = function(arg1, arg2) {
        //code
      }
      someFunction('value1', 'value2');
    }
}

但是,如果您使用EcmaScript-6 letconst关键字声明变量,则它们具有块范围且不会被提升。

答案 1 :(得分:0)

  

但我的问题是Javascript如何处理条件语句或循环的代码块?

传统上,这些块不会得到它们自己的作用域,这意味着你不能在它们中声明局部变量(它们会被提升为函数级)。

对于来自其他编程语言的人来说,这种行为是非常意外的,并且导致了无端的错误。

为了缓解这种情况,现在(ECMAScript 6)有一个let keyword,允许您声明各个代码块的局部变量。但请记住,var仍然可以像往常一样工作。

答案 2 :(得分:-1)

如果您所说的e在C或C ++等中是code block,那么javascript就没有这样的,或者有不同的。{/ p>

在javascript中,它被称为{ }。也许其他语言也有关于它的概念。

Javascript仅在

上生成scope chain

1) function(){}

2) with(){}

3) catch(){}

例如,最着名的例子如下。

scope chain

如果我们点击任何div,则for (var i = 0; i < 5; i++) { // setClickEventToDiv(i) } 之间的活动会自setClickEventToDiv(i)开始5

所以,通过

修复它
scope chain

因为for (var i = 0; i < 5; i++) { (function (index) { //setClickEventToDiv(index) }(i)); } 拥有自己的function () {}