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...