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
有没有大神给我仔细的讲解一下!感激不尽!
简单来讲: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赋下一个值……
谢谢,懂了
尼玛,这解答居然被认可,误导人啊!
“因为for循环执行非常快,循环里面的push操作在执行之前,i就已经循环完了,循环结束(也就是i=10时,条件不符,结束循环),而接下来才是执行push方法,所以每次输出都是10” 完全就是错的
这只是一个作用域的问题。真是醉了。。。
不要去搞js作用域.
想搞的话去找篇讲这个的文章.应该会很长.这里写不下的.
好的