for(var i=0;i<5;i++){
setTimeout(function() {
console.log(i);
}, 0)
} // 結果 5 5 5 5 5
for(let i=0;i<5;i++){
setTimeout(function() {
console.log(i);
}, 0)
} // 結果 0 1 2 3 4
由於 var 命令的變量提升機制,var 命令實際只會執行一次。
而 let 命令不存在變量提升,所以每次循環都會執行一次,聲明一個新變量(但初始化的值不一樣)。
for 的每次循環都是不同的塊級作用域,let 聲明的變量是塊級作用域的,所以也不存在重復聲明的問題。
let生命變量的for循環里,每個匿名函數實際上引用的都是一個新的變量