閉包

閉包

就是可以讓函數(shù)訪問該函數(shù)聲明時的作用域內(nèi)的所有變量和函數(shù)。

例如:

接下來是關(guān)于()的有意思的用法?!?)”緊跟在函數(shù)后面,表示立即調(diào)用該函數(shù)

例如:

代碼定義了一個立即執(zhí)行函數(shù)并返回給counter,這個函數(shù)定義了一個局部變量count,返回了一個子函數(shù),該子函數(shù)每次調(diào)用,都會把count加一并返回,下一次調(diào)用時會在上一次調(diào)用的基礎(chǔ)上加一,可以想象成閉包將保護著count每一次運行的值。

等效于

需要避免的問題:

add_the_handlers函數(shù)本意是想傳遞給每個事件處理器一個唯一的值(i)。也就是每次點擊nodes時,輸出對應(yīng)的 i 。但事實上,每次點擊nodes,只會在控制臺輸出相同的值。

這是因為事件處理器函數(shù)綁定了變量 i 本身,而不是函數(shù)在構(gòu)造時的變量 i 的值。換句話說閉包中輸出的 i 是它所在作用域中的 i 的值,在循環(huán)結(jié)束后 i 的值變?yōu)?。而閉包本身綁定了變量 i ,輸出的值會跟隨變量 i 的變化而變化,最后輸出4。

要使每次點擊nodes時,輸出對應(yīng)的 i,可使用下述代碼:

這里使用一個立即執(zhí)行函數(shù)并傳遞當(dāng)前的 i 值即上面的(i),返回一個新的函數(shù)。在這個新生成的函數(shù)的閉包中保存了當(dāng)前的 i 值。這樣可以得到想要的結(jié)果了。

還有一個和變量提升有關(guān)的容易混淆的東西:

代碼詳情可參見我的博客胖胖梅博客JS筆記之閉包?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容