为什么var和let会在闭包中产生不同的输出?

时间:2018-02-22 15:50:09

标签: javascript

考虑这两个片段:

使用SELECT reltuples AS approximate_row_count FROM pg_class WHERE relname = 'users';



let




使用for(let i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }, 100) }

&#13;
&#13;
var
&#13;
&#13;
&#13;

根据我的理解,for(var i = 0; i < 10; i++) { //HERE setTimeout(function() { console.log(i); }, 100) }只影响变量的范围,那么为什么2个循环的输出应该相同,那么为什么let打印0-9和{{1}打印10次10​​次?

1 个答案:

答案 0 :(得分:2)

因为循环中有超时,所以在整个循环结束之前都不会调用任何日志。

循环结束后,如果您使用i,则var的值为10。

但是let是块作用域的,这意味着它在循环中的任何地方都是相同的值,即使在像setTimeout这样的异步函数中(除非你在循环中手动更改它) - 因为循环在每个循环中创建一个新的作用域迭代,几乎就像每次迭代在使用let时创建i变量的新“实例”,而使用var每个循环使用i变量的相同实例。 / p>