let塊級作用域


一直只是明白,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);
for (let i = 0; i < 3; i++) { 
console.log(i);//1,2,3
  setTimeout(function() {  
    console.log(i);       
  }, 0);
打印的結果都是123,為什么執行下一步就會變換成不同的結果呢?
這是我查詢一篇文章所聽到最好的解答: JS中的for循環體比較特殊,每次執行都是一個全新的獨立的塊作用域

1.定時器為異步執行,for循環的執行速度很快,當真正執行到函數體時,此時i早已變成3,所以結果不想而知。

循環展開如下(var具備變量提升,且不支持塊級作用域,所以如下代碼只有一個全局變量i)

2.let支持塊級作用域,var不支持(var只有函數作用域和全局作用域),所以let聲明的變量只在它所在的代碼塊有效。

循環展開如下(let沒有變量提升,且支持塊級作用域,所以如下代碼每個塊內都有一個獨立的i)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM