我正在读《你不懂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,它是否仍每次都会增加一个,从而避免了无限循环?
答案 0 :(得分:2)
Javascript具有提升..的概念,您可以在声明变量之前使用变量。在执行代码之前,javascript将所有声明变量的语句放在顶部,因此使for和bar的i范围相同。
了解有关吊装的信息。答案 1 :(得分:2)
由于bar
的{{1}}没有用i
声明,因此它使用了可以在外部范围中找到的第一个var
:i
的foo
。所以发生了:
i
循环将for
设置为i
。0
将bar(0);
设置为i
。3
循环将for
从i
递增到3
。4
将bar(6);
设置为i
... 第3步和第4步无休止地重复,因为3
始终为i<10
。
(这种事情就是为什么我不喜欢JavaScript的原因。)