在" Junior" Web Developer面试。他们问什么是
的输出var funcs = [];
for ( var i = 0; i < 5; ++i )
{
funcs.push(function ( ) { console.log("i = " + i); });
}
funcs.forEach(function ( el ) { el(); });
是,他们让我解释原因。好吧,我搞砸了。后来我继续JSFiddle,发现输出是
i = 5
i = 5
i = 5
i = 5
i = 5
我发现它与导致闭包的for
循环有关。但是,我仍然不明白表达式i
右侧的"i = " + i
如何更新为i
增量。我会理解它是console.log(i)
但是没有i
在数学表达式中使该表达式为r值的事实????我从来没有听说过编程语言,你可以做一些像
i = 5;
y = 2 + i;
++i;
// now y is 8
这很混乱。社会不能这样运作。
答案 0 :(得分:1)
它是一个闭包,变量的作用域是功能级别,没有块级别。
所以在你的for循环之后,仍然定义了i
,它的值是5,因为它是退出循环之前的最后一个值。
控制台日志和字符串连接在forEach
中执行,因此i
已经有了它的值,5
如果你想在块级别中有一个变量,你应该使用let,但请记住它是javascript6的一个特性
for ( let i = 0; i < 5; ++i )
在这种情况下,i
中的console.log
将被取消定义,因为i
不再可访问