[英]Variables with the same name in nested functions
我正在阅读你不知道的 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();
引擎不会在 for 循环中查找(并坚持赋值) i
,因为它已经声明并且在foo
的范围内?
为什么它会去到酒吧里面的i
?
此外,即使i
的值被重新分配为 3,它不会每次仍然增加 1,从而避免无限循环吗?
Javascript 具有提升的概念。您可以在声明变量之前使用变量。 在执行代码之前,javascript 会将所有声明变量的语句带到顶部,从而使 i 的范围在 for 和 bar 中相同。
您可以在此处阅读有关提升的信息https://www.w3schools.com/js/js_hoisting.asp
因为bar
的i
没有用var
声明,所以它使用它在外部作用域中可以找到的第一个i
: foo
的i
。 所以会发生这种情况:
for
循环将i
设置为0
。bar(0);
将i
设置为3
。for
循环将i
从3
增加到4
。bar(8);
将i
设置为3
... 第 3 步和第 4 步无休止地重复,因为i<10
总是true
。
(这种事情就是我不喜欢 JavaScript 的原因。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.