为什么在for循环终止后调用函数会导致索引变量相同?

时间:2015-10-30 04:04:58

标签: javascript

在" 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

http://jsfiddle.net/wen3us7y/

我发现它与导致闭包的for循环有关。但是,我仍然不明白表达式i右侧的"i = " + i如何更新为i增量。我会理解它是console.log(i)但是没有i在数学表达式中使该表达式为r值的事实????我从来没有听说过编程语言,你可以做一些像

这样的事情
i = 5;
y = 2 + i;
++i;
// now y is 8

这很混乱。社会不能这样运作。

1 个答案:

答案 0 :(得分:1)

它是一个闭包,变量的作用域是功能级别,没有块级别。

所以在你的for循环之后,仍然定义了i,它的值是5,因为它是退出循环之前的最后一个值。

控制台日志和字符串连接在forEach中执行,因此i已经有了它的值,5

如果你想在块级别中有一个变量,你应该使用let,但请记住它是javascript6的一个特性

for ( let i = 0; i < 5; ++i )

在这种情况下,i中的console.log将被取消定义,因为i不再可访问