这是在一次“初级”网站开发人员访谈中被问到的。他们问的输出是什么?
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 = 5http://jsfiddle.net/wen3us7y/
我发现这与导致关闭的for循环有关。但是,我还是不明白表达式"i = " + i右侧的"i = " + i是如何随着i的增加而更新的。如果是console.log(i),我会理解,但i在数学表达式中的事实是否使这个表达式成为r值?我从未听说过一种编程语言,您可以这样做
i = 5;
y = 2 + i;
++i;
// now y is 8这是混乱。社会不能这样运作。
发布于 2015-10-30 04:11:13
这是一个闭包,变量的作用域是函数级,而不是块级。
因此,在for循环之后,仍然定义了i,其值为5,因为它是退出循环之前的最后一个值。
控制台日志和字符串连接在forEach中执行,因此i已经有了它的值,5
如果您希望在块级别上有一个变量,则应该使用让,但请记住,它是javascript6的一个特性。
for ( let i = 0; i < 5; ++i )在这种情况下,i在console.log中将是未定义的,因为i不再是可访问的。
https://stackoverflow.com/questions/33428473
复制相似问题