一直只是明白,let是塊級作用域,但是這個概念很模糊,
下面有個循環的題目我們來看是如何用塊級作用域來解決的
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
當我們執行的時候我們得到的答案是3,3,3
我們改為let定義變量的時候
for (let i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
}, 0);
}
執行結果毫無疑問大家應該都是知道的,1,2,3
但是大家都說是塊級作用域,那么塊級作用域是有什么作用呢?
當我們用var和let定義的時候,我們打印一下
for (var i = 0; i < 3; i++) {
console.log(i);//1,2,3
setTimeout(function() {
console.log(i);
}, 0);
setTimeout(function() {
console.log(i);
}, 0);
for (let i = 0; i < 3; i++) {
console.log(i);//1,2,3
setTimeout(function() {
console.log(i);
}, 0);
setTimeout(function() {
console.log(i);
}, 0);
打印的結果都是123,為什么執行下一步就會變換成不同的結果呢?
這是我查詢一篇文章所聽到最好的解答:
JS中的for循環體比較特殊,每次執行都是一個全新的獨立的塊作用域
1.定時器為異步執行,for循環的執行速度很快,當真正執行到函數體時,此時i早已變成3,所以結果不想而知。
循環展開如下(var具備變量提升,且不支持塊級作用域,所以如下代碼只有一個全局變量i)
2.let支持塊級作用域,var不支持(var只有函數作用域和全局作用域),所以let聲明的變量只在它所在的代碼塊有效。
循環展開如下(let沒有變量提升,且支持塊級作用域,所以如下代碼每個塊內都有一個獨立的i)