首页 > 解决方案 > 两个相同的命名标识符如何导致此代码中的无限循环?

问题描述

任何人都可以从 ydkjs 解释这段代码。主题是防撞。这是一个无限循环,我无法理解如何?我在 sublime 文本编辑器中运行代码,第一个输出是 3,然后第二个输出是 11,它可以无限运行。

function foo() {
  function bar(a) {
    i = 3;
    console.log(a + i);
  }
  for (var i = 0; i < 10; i++) {
    bar(i * 2);
  }
}
foo();

标签: javascript

解决方案


当你使用 声明一个变量时var = ,它的作用域是整个函数。您的代码大致相当于:

function foo() {
  var i;
  for (i = 0; i < 10; i++) {
    i = 3;
  }
}
foo();

这显然是一个无限循环,i永远不会变成>= 10

如果您使用let i = 0, theni将被限定为循环,因此i内部的“其他”bar无关紧要:

function foo() {
  function bar(a) {
    i = 3;
    console.log(a + i);
  }
  for (let i = 0; i < 10; i++) {
    bar(i * 2);
  }
}
foo();


推荐阅读