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

Javascript中奇怪的迭代变量作用域,javascript,scope,Javascript,Scope,所以我有一些本地javascript代码,我正在使用Node(v6.0.0)执行这些代码。当javascript在内存堆中内存不足时遇到错误,我注意到了一些奇怪的事情;迭代变量作用域“跟随”到循环中调用的函数中。考虑这个例子; function foo() { for (i = 0; i < 2; i++) { console.log(`i in foo():${i}`); } } function bar() { for (i = 0; i < 2; i++)

所以我有一些本地javascript代码,我正在使用Node(v6.0.0)执行这些代码。当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}`);
  }
}
但它实际打印的内容如下:

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

然后退出。这是Javascript的预期行为吗?我希望I变量的作用域不会继续正常地进入被调用函数

在您的代码中,
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}`);
  }
}
函数foo(){
for(设i=0;i<2;i++){
//---^^^^^^^^^---------------
log(`i in foo():${i}`);
}
}
功能条(){
for(设i=0;i<2;i++){
foo();
log(`i in bar():${i}`);
}
}

您只有一个
i
,您将其作为隐式全局变量。使用
var
let
正确声明
i
,则不会出现此问题。切勿隐式分配给全局对象。总是声明变量,我明白了,这就解释了。谢谢以前没有在for循环声明中看到过“let”,但我仍然习惯于转换。干杯@NyfikenGul当您开始使用js时,尝试在严格模式下编写代码,这将节省您的时间。:-)
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}`);
  }
}