閉包
就是可以讓函數(shù)訪問該函數(shù)聲明時(shí)的作用域內(nèi)的所有變量和函數(shù)。
例如:
接下來是關(guān)于()的有意思的用法谜慌±颊洌“()”緊跟在函數(shù)后面温亲,表示立即調(diào)用該函數(shù)
例如:
代碼定義了一個(gè)立即執(zhí)行函數(shù)并返回給counter藕溅,這個(gè)函數(shù)定義了一個(gè)局部變量count匕得,返回了一個(gè)子函數(shù),該子函數(shù)每次調(diào)用巾表,都會(huì)把count加一并返回汁掠,下一次調(diào)用時(shí)會(huì)在上一次調(diào)用的基礎(chǔ)上加一,可以想象成閉包將保護(hù)著count每一次運(yùn)行的值集币。
等效于
需要避免的問題:
add_the_handlers函數(shù)本意是想傳遞給每個(gè)事件處理器一個(gè)唯一的值(i)考阱。也就是每次點(diǎn)擊nodes時(shí),輸出對(duì)應(yīng)的 i 鞠苟。但事實(shí)上羔砾,每次點(diǎn)擊nodes,只會(huì)在控制臺(tái)輸出相同的值偶妖。
這是因?yàn)槭录幚砥骱瘮?shù)綁定了變量 i 本身,而不是函數(shù)在構(gòu)造時(shí)的變量 i 的值政溃。換句話說閉包中輸出的 i 是它所在作用域中的 i 的值趾访,在循環(huán)結(jié)束后 i 的值變?yōu)?。而閉包本身綁定了變量 i ,輸出的值會(huì)跟隨變量 i 的變化而變化董虱,最后輸出4扼鞋。
要使每次點(diǎn)擊nodes時(shí)申鱼,輸出對(duì)應(yīng)的 i,可使用下述代碼:
這里使用一個(gè)立即執(zhí)行函數(shù)并傳遞當(dāng)前的 i 值即上面的(i)云头,返回一個(gè)新的函數(shù)捐友。在這個(gè)新生成的函數(shù)的閉包中保存了當(dāng)前的 i 值。這樣可以得到想要的結(jié)果了溃槐。
還有一個(gè)和變量提升有關(guān)的容易混淆的東西:
代碼詳情可參見我的博客胖胖梅博客JS筆記之閉包?