首页 新闻 搜索 专区 学院

js的作用域问题

0
[已解决问题] 解决于 2016-12-26 11:29
const Greeters = []
for (var i = 0 ; i < 10 ; i++) {
  Greeters.push(function () { return console.log(i) })
}

Greeters[0]() // 10
Greeters[1]() // 10
Greeters[2]() // 10

有没有大神给我仔细的讲解一下!感激不尽!

Yhspehy的主页 Yhspehy | 菜鸟二级 | 园豆:232
提问于:2016-12-25 13:56
< >
分享
最佳答案
0

简单来讲:Greeters.push(function () { return console.log(i) });这里面构成了一个闭包!

for语句自身也是一个闭包!

因为for循环执行非常快,循环里面的push操作在执行之前,i就已经循环完了,循环结束(也就是i=10时,条件不符,结束循环),而接下来才是执行push方法,所以每次输出都是10;

对于你想要的答案,因为var定义的是全局变量,你上面用了ES6的const定义常量的方式,想必,也听过let定义局部变量的作用;

你只需要把for循环里面的var改成let---------然后,输出的就是//0;  //1;   //2;了

因为:let定义的是块级作用域,也就是let定义i变量之后,会先给i附一个值,待push语句执行完,接着给i赋下一个值……

奖励园豆:5
飞天龙猫 | 初学一级 |园豆:176 | 2016-12-25 21:22

谢谢,懂了

Yhspehy | 园豆:232 (菜鸟二级) | 2016-12-26 11:29

尼玛,这解答居然被认可,误导人啊!
“因为for循环执行非常快,循环里面的push操作在执行之前,i就已经循环完了,循环结束(也就是i=10时,条件不符,结束循环),而接下来才是执行push方法,所以每次输出都是10” 完全就是错的
这只是一个作用域的问题。真是醉了。。。

源丰集团 | 园豆:200 (初学一级) | 2017-07-04 18:14
其他回答(1)
0

不要去搞js作用域.

想搞的话去找篇讲这个的文章.应该会很长.这里写不下的.

 

吴瑞祥 | 园豆:28979 (高人七级) | 2016-12-25 21:10

好的

支持(0) 反对(0) Yhspehy | 园豆:232 (菜鸟二级) | 2016-12-26 11:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册