首页 文章

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

提问于
浏览
0

我知道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 回答

  • 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 关键字声明变量,则它们具有块范围且不会被提升 .

  • 0

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

    传统上,这些块不会获得自己的范围,这意味着您不能在其中声明局部变量(它们将被提升为功能级别) .

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

    为了缓解这种情况,现在(ECMAScript 6)a let keyword允许您声明各个代码块的本地变量 . 但请记住, var 仍将以其始终如一的方式工作 .

  • -1

    如果你说 code block 是C或C等中的一种 { } ,javascript没有这样的或者有不同的那个 .

    在javascript中,它被称为 scope chain . 也许其他语言也有关于它的概念 .

    并且Javascript只能使 scope chain 开启

    1) function () { }

    2) with () { }

    3) catch () { }

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

    for (var i = 0; i < 5; i++) { 
        // setClickEventToDiv(i)
    }
    

    如果我们单击任何div,由 setClickEventToDiv(i) 发生事件,将自 scope chain5 .

    所以,解决它

    for (var i = 0; i < 5; i++) {
        (function (index) { 
            //setClickEventToDiv(index) 
        }(i));
    }
    

    因为 function () {}scope

相关问题