本文我們將和大家分享兩種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,會出現以下效果:
相關推薦:
Javascript for循環if判斷語句詳解
for-in循環和for循環遍歷數組的用法
javascript中for循環使用時的注意事項
以上就是JS中for循環閉包問題如何解決的詳細內容,更多請關注php中文網其它相關文章!