首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在for循环结束后调用函数会导致索引变量相同?

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

Stack Overflow用户
提问于 2015-10-30 04:04:58
回答 1查看 71关注 0票数 1

这是在一次“初级”网站开发人员访谈中被问到的。他们问的输出是什么?

代码语言:javascript
复制
var funcs = [];
for ( var i = 0; i < 5; ++i )
{
    funcs.push(function ( ) { console.log("i = " + i); });    
}
funcs.forEach(function ( el ) { el(); });

他们让我解释原因。我搞砸了。后来,我继续使用JSFiddle,发现输出是

代码语言:javascript
复制
i = 5 
i = 5
i = 5
i = 5
i = 5

http://jsfiddle.net/wen3us7y/

我发现这与导致关闭的for循环有关。但是,我还是不明白表达式"i = " + i右侧的"i = " + i是如何随着i的增加而更新的。如果是console.log(i),我会理解,但i在数学表达式中的事实是否使这个表达式成为r值?我从未听说过一种编程语言,您可以这样做

代码语言:javascript
复制
i = 5;
y = 2 + i;
++i;
// now y is 8

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-30 04:11:13

这是一个闭包,变量的作用域是函数级,而不是块级。

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

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

如果您希望在块级别上有一个变量,则应该使用,但请记住,它是javascript6的一个特性。

代码语言:javascript
复制
for ( let i = 0; i < 5; ++i )

在这种情况下,iconsole.log中将是未定义的,因为i不再是可访问的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33428473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档