let聲明在for循環語句中可以拿到正確的作用域
for (var i = 0;i<10;i++)
{
setTimeout(function(){console.log(i);},100*i); // 10個10
}
console.log('====')
console.log(i) //10
console.log('====')
for (let i = 0;i<10;i++)
{
setTimeout(function(){console.log(i);},100*i); // 0到9
}
console.log('====')
console.log(i) // i is not defined
console.log('====')
當用let
聲明一個變量,它使用的是詞法作用域或塊作用域。 不同於使用 var
聲明的變量那樣可以在包含它們的函數外訪問,塊作用域變量在包含它們的塊或for
循環之外是不能訪問的。
當let
聲明出現在循環體里時擁有完全不同的行為。 不僅是在循環里引入了一個新的變量環境,而是針對 每次迭代都會創建這樣一個新作用域。 這就是我們在使用立即執行的函數表達式時做的事,所以在 setTimeout
例子里我們僅使用let
聲明就可以了。