Javascript中奇怪的迭代变量作用域

时间:2019-03-12 18:23:15

标签: javascript scope

所以我有一些正在用Node(v6.0.0)执行的本地javascript代码。在JavaScript错误导致内存堆内存不足后,我注意到了一些奇怪的事情;迭代变量将作用域“跟随”为循环中调用的函数。考虑这个例子;

function foo() {
  for (i = 0; i < 2; i++) {
    console.log(`i in foo():${i}`);
  }
}

function bar() {
  for (i = 0; i < 2; i++) {
    foo();
    console.log(`i in bar():${i}`);
  }
}

来自Java,我希望它可以打印

i in foo(): 0
i in foo(): 1
i in bar(): 0
i in foo(): 0
i in foo(): 1
i in bar(): 1

但是实际打印的内容如下:

i in foo(): 0
i in foo(): 1
i in bar(): 2

然后退出。这是Java的预期行为吗?我希望i变量的范围不会正常继续进入被调用的函数。

1 个答案:

答案 0 :(得分:2)

在您的代码i中没有定义任何地方,因此将在全局范围内定义。因此,请在for循环中初始化变量以创建局部变量。

function foo() {
  for (let i = 0; i < 2; i++) {
  //---^^^^^^^^^---------------
    console.log(`i in foo():${i}`);
  }
}

function bar() {
  for (let i = 0; i < 2; i++) {
    foo();
    console.log(`i in bar():${i}`);
  }
}