嵌套函数中具有相同名称的变量

时间:2018-11-17 20:04:19

标签: javascript

我正在读《你不懂JS》,下面的示例使我有些困惑:

function foo () {
    function bar (a) {
        i = 3; // changing the `i` in the enclosing scope's for-loop
        console.log(a + i);
    }

    for (var i = 0; i < 10; i++) {
        bar(i * 2); // oops, infinite loop ahead!
    }
}

foo();

由于引擎是在i的范围内声明的,因此引擎不会在for循环内查找foo吗(并坚持分配)?

为什么会转到栏内的i

此外,即使将i的值重新分配为3,它是否仍每次都会增加一个,从而避免了无限循环?

2 个答案:

答案 0 :(得分:2)

Javascript具有提升..的概念,您可以在声明变量之前使用变量。在执行代码之前,javascript将所有声明变量的语句放在顶部,因此使for和bar的i范围相同。

您可以在这里https://www.w3schools.com/js/js_hoisting.asp

了解有关吊装的信息。

答案 1 :(得分:2)

由于bar的{​​{1}}没有用i声明,因此它使用了可以在外部范围中找到的第一个varifoo。所以发生了:

  1. i循环将for设置为i
  2. 0bar(0);设置为i
  3. 3循环将fori递增到3
  4. 4bar(6);设置为i ...

第3步和第4步无休止地重复,因为3始终为i<10

(这种事情就是为什么我不喜欢JavaScript的原因。)