js 關於閉包 let var的乙個考題

2022-02-17 07:36:58 字數 847 閱讀 4302

html:

body中有2個div

遍歷,給每個div新增點選事件,輸出值。

js:

var宣告:

效果:點選每個div後都列印2。

使用者點選前,for迴圈就已經執行完了,是2,onclick裡面拿到的就只有2。

var申明的變數i,作用域不僅在for內部,也在for外部。for之後也能使用這個i

換個寫法就懂了:

let宣告:

效果:點第乙個輸出0,第二個輸出1。

let的塊級作用域,且for中的let變數只對內部有效,每次迴圈的i都是新的i,不會重複使用。onclick的**的每個i都是獨立的。

如果還是var,使用閉包的方式,也能達到變數獨立的效果。

效果:點第乙個輸出0,第二個輸出1。

for迴圈時i在變化,但是i已傳入閉包,即可獨立存在。

divs[i]中的i是function(i)傳進來的引數,獨立的。

換種寫法就懂了:

for內部,呼叫的是個外部的函式,i變成了引數的傳遞。

關於js的閉包

要理解上面的問題,首先要理解清楚幾個概念 來自 閉包裡的微觀世界 區別就是值型別變數是可以直接訪問棧 stack 中的值 接下來的內容就是關於閉包的微觀世界 function a return b var c a 函式a執行後返回函式b,並將函式b賦給c c 輸出 1 本來這個地方變數i是定義在函式...

乙個JS菜鳥對閉包的理解

閉包就是能夠讀取其他函式內部變數的函式,在js中,只有函式內部的子函式才能讀取區域性變數,這就造成的一些使用時的不便。而閉包函式的作用就是,像一座橋梁一樣將函式內部和函式外部連線起來。可以保護變數,避免汙染。函式a內部直接或間接返回乙個函式b b函式內部使用函式a內部的私有變數 私有資料 a函式內部...

閉包的乙個坑

閉包的乙個坑 for var i 0 i 5 i 5 上面這個 塊會列印五個5出來,而我們預想的結果是列印 1 2 3 4 5。之所以會這樣,是因為 settimeout 中的 i 是對外層 i 的引用。當 settimeout 的 被解釋的時候,執行時只是記錄了 i 的引用,而不是值。而當 set...