閉包
就是可以讓函數(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筆記之閉包?