考虑这两个片段:
使用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)
}
:
var
&#13;
根据我的理解,for(var i = 0; i < 10; i++) { //HERE
setTimeout(function() {
console.log(i);
}, 100)
}
只影响变量的范围,那么为什么2个循环的输出应该相同,那么为什么let
打印0-9和{{1}打印10次10次?
答案 0 :(得分:2)
因为循环中有超时,所以在整个循环结束之前都不会调用任何日志。
循环结束后,如果您使用i
,则var
的值为10。
但是let
是块作用域的,这意味着它在循环中的任何地方都是相同的值,即使在像setTimeout这样的异步函数中(除非你在循环中手动更改它) - 因为循环在每个循环中创建一个新的作用域迭代,几乎就像每次迭代在使用let
时创建i变量的新“实例”,而使用var
每个循环使用i
变量的相同实例。 / p>