理解let並 const在JavaScript ES6中(2)

cenfeng發表於2019-07-18

let 使用相同的名稱 定義多個 變數

雖然您無法 let 在一個塊中多次 定義同一個 變數,但沒有什麼可以阻止您在另一個塊中執行此操作。 要記住的是ES6指令碼將它們視為單獨的變數:

1
2
3
4
6
<font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" >讓mybrother = '保羅' </font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" >
if true ){ //新塊</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
     讓mybrother = '傑森' </font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" >
     console.log(mybrother) //傑森</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" >
console.log(mybrother) //保羅</font></font>

我們已經宣佈 let mybrother兩次,每個塊一次,這是有效的。 每個 mybrother 變數都與另一個變數不同,它是在其定義的塊中的域之王。如果我們替換 let var console.log()  在兩個例項中都會返回“Jason”,因為第二個 var  宣告在遇到時會用值“Jason”覆蓋第一個。

使用 let 裡面的(...)迴圈

當談到 for(var i;;) JavaScript中的迴圈時,使用 let 而不是 var 跟蹤迭代提供了獨特的優勢 - 我們不再需要在迴圈內使用IIFE(立即呼叫的函式表示式)來正確捕獲每個迭代變數的值我們應該在以後需要這些值。

考慮以下傳統的for迴圈,它嘗試在迴圈執行時之後呼叫迭代變數的值,  setTimeout 例如:

1
2
3
4
6
<font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" > for var i = 0; i <5; i ++){</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" >
     的setTimeout(函式(){</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" >
         的console.log(ⅰ)</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" >
     },i * 100)</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" >
}</font></font><font></font><font style= "vertical-align: inherit;" ><font style= "vertical-align: inherit;" >
//記錄'5,5,5,5,5'</font></font>

這失敗了,你得到的只是 i  最後一次迭代 的值 ,而不是0,1,2,3,4。問題是 var  變數沒有作用於它所在的塊,因此無處可訪問,無論是在函式是在函式中定義的,或者在函式外部全域性定義的函式。 這意味著 i 在for迴圈期間重複覆蓋 變數 setTimeout 試圖回憶時  i ,所有它得到的是最後一個值 i 被設定為。

在過去,克服這個麻煩問題的常用方法是在for迴圈中丟擲一個IIFE來建立一個閉包,捕獲 i 每次迭代 的值 

1
2
3
4
6
7
8
for ( var i = 0; i < 5; i++){<font></font>
     ( function (x){<font></font>
         setTimeout( function (){<font></font>
             console.log(x)<font></font>
         }, i * 100)<font></font>
     })(i)<font></font>
}<font></font>
//logs '0, 1, 2, 3, 4'

現在它起作用了,但是,如此醜陋和冗長。

替換 var let 自動解決這個常見問題,因為迭代變數使用 let 範圍 定義 i 了它所在的塊的 每個例項 ,建立了與圍繞for迴圈包裝IIFE相同的結果:

1
2
3
4
6
for (let i = 0; i < 5; i++){<font></font>
     setTimeout( function (){<font></font>
         console.log(i)<font></font>
     }, i * 100)<font></font>
}<font></font>
//logs '0, 1, 2, 3, 4'

i 無論延遲如何,都會返回 正確的 gets  這在許多場景中都很有用,例如依賴於生成 i 不同請求 的值的迴圈內的Ajax請求 ,或者利用值 i 來執行鍼對其繫結的元素定製的操作的 事件處理程式 這是後來的一個例子:

1
2
3
4
6
let links = document.getElementsByTagName( 'a' )<font></font>
for (let i=0; i<links.length; i++){<font></font>
     links[i].onclick = function (){<font></font>
         alert( 'You clicked on link ' + (i+1))<font></font>
     }<font></font>
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69933200/viewspace-2651012/,如需轉載,請註明出處,否則將追究法律責任。

相關文章