本文我們將和大家分享兩種JS中for迴圈閉包問題如何解決的方法,希望能幫助大家。
像這樣一個程式碼片段,初學者會理所當然地認為依序點擊Li會彈出對應的0、1、2、3、4、5,但實際結果卻是這樣的
我們無論點哪個按鈕,最後彈出來的都是6。這就是經典的for迴圈閉包問題。
那麼,首先讓我們來了解什麼是閉包,百度百科是這樣解釋的:閉包是可以包含自由(未綁定到特定物件)變數的程式碼區塊;這些變數不是在這個程式碼區塊內或任何全域上下文中定義的,而是在定義程式碼區塊的環境中定義(局部變數)。 「閉包」 一詞來自以下兩者的結合:要執行的程式碼區塊(由於自由變數被包含在程式碼區塊中,這些自由變數以及它們引用的物件沒有被釋放)和為自由變數提供綁定的計算環境(作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Lua、objective c 以及Java(Java8以上)等語言中都能找到對閉包不同程度的支援。
而我的簡單理解就是:一個函數中嵌套了另一個函數,裡面的一個函數要存取外層函數的變量,所以就形成了一個閉包,閉包就是為了保留某些局部變數的值而存在的。
然而javascript 有些常見的閉包問題,例如上面的例子,那麼我們來看看怎麼解決這些問題。
解決方案一:加一層閉包,i 以函數參數形式傳遞給內層函數:
結果就是點選對應的li會彈出對應的數字,例如點第三個li,會出現以下效果:
解二:找個屬性將i值儲存起來,然後彈出這個值
點第三個li,會出現以下效果:
#相關推薦:
以上是JS中for迴圈閉包問題如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!