布爾教育 PHP學(xué)習(xí)筆記
朋友正在學(xué)JS, 到閉包這一塊遇到了一些障礙.
我在網(wǎng)上幫她找了一些文章,但又寫的又枯燥又長(zhǎng),我來(lái)寫一篇簡(jiǎn)單點(diǎn)的吧.
從一次穿越說(shuō)起—–
有姐妹倆,大桃花和小桃花相繼出生,
有一次小桃花在河邊洗衣服,出現(xiàn)奇特星像–十字連珠,小桃花穿越到了清朝.
還進(jìn)宮見(jiàn)到了四阿哥,身邊有一群宮女,和小桃花妹相稱.
四阿哥問(wèn):”小桃花,你的姐姐是誰(shuí)?”
小桃花怎么答? 這牽涉到一個(gè)問(wèn)題—-
人穿越后,對(duì)其親人的計(jì)算,以”出生時(shí)的環(huán)境“為準(zhǔn),還是”當(dāng)前問(wèn)她時(shí)的環(huán)境“為準(zhǔn)?
如果你回答:”以當(dāng)前問(wèn)她是為準(zhǔn)”,那你是”賣姐求榮”啊!
如果你回答:”以她出生時(shí)為準(zhǔn),即回答大桃花” —-,恭喜你,你已理解了閉包.
閉包即 函數(shù)定義時(shí),連同其定義環(huán)境的上下文,形成一個(gè)整體.
不管該函數(shù)在哪兒運(yùn)行,其對(duì)變量的訪問(wèn),都要從定義處開始尋找.
例子1: 看你理解了閉包沒(méi)
例子二: 再?gòu)?fù)雜一點(diǎn),來(lái)個(gè)閉包計(jì)數(shù)器
如果你準(zhǔn)備在頁(yè)面內(nèi)建一個(gè)”統(tǒng)一id號(hào)生成器”,
比如為各種事件句柄,或者事件調(diào)用統(tǒng)一分配不重復(fù)的id,
(jquery里就有類似的應(yīng)用).
—如何來(lái)做呢?
你可能說(shuō):”好辦,弄個(gè)全局變量,叫count, 每次都把+1″,
全局變量可以做到,但是這種做法不夠優(yōu)雅,造成全局變量污染.
更壞的是這個(gè)變量,容易被別人(不小心)定義的同名全局變量給覆蓋了.:(
怎么辦? 用閉包!
在上面的例子中,
1:除了counter()函數(shù),其他語(yǔ)句對(duì)于cnt都?jí)虿恢?摸不到.
2: 匿名函數(shù)執(zhí)行后,給人的感覺(jué)是—-函數(shù)內(nèi)的局部變量 cnt應(yīng)該消失才對(duì),
實(shí)際上沒(méi)有消失—-被返回的函數(shù)所捕捉,形成了一個(gè)”環(huán)境變量+函數(shù)”的包,
外界又打不進(jìn)去, 所以叫閉包啊.大笑
例子三: 如何在JS的面向?qū)ο髴?yīng)用中,寫一個(gè)私有屬性?
你已經(jīng)猜到了,還是用閉包.
例子四: 看你確實(shí)掌握了閉包沒(méi)?
閉包很簡(jiǎn)單,,只是大家給形容難了….