在let出現之前,我們在for循環中是用var定義的迭代器變量會溢出循環體:
for(var i=0;i<5;i++){
//循環內容
}
console.log(i);//5
當使用let聲明時,這個問題就不存在了,因為let聲明的迭代器變量作用域僅限於for循環體。
for(let i=0;i<5;i++){
//循環內容
}
console.log(i)// ReferenceError: i is not defined
使用var聲明時,經常遇到的問題就是迭代器變量的奇怪聲明和修改。
for(var i=0;i<5;i++){
setTimeout(()=>console.log(i),0)
}
這個循環你想要的列印結果是0、1、2、3、4,但是實際結果是5、5、5、5。
這個函數可以使用箭頭函數:
for(var i=0;i<5;i++){
setTimeout(function(){console.log(i);},0)
}。
上面的列印結果之所以是5、5、5、5,是因為在迭循環退出時,迭代器變量仍然被設置為使循環結束退出的值5。所以導致後面的setTimeout運行的時候引用的是同一個變量i=5,因此console.log(i)最終的值是5。
如果我們使用let聲明for循環的迭代器變量:
for(let i=0;i<5;i++){
setTimeout(()=>console.log(i);0);
}
列印輸出的結果:0、1、2、3、4
當我們使用let聲明for循環的迭代器變量時,js引擎會每循環一次就聲明一個新的迭代器變量,直到聲明的變量小於5時循環結束退出。所以每次setTimeout引用的都是獨立的迭代器變量實體,因此console.log()輸出的值技術執行循環迭代器時的迭代器變量值。