關(guān)于JS 閉包

簡(jiǎn)單點(diǎn)說:「函數(shù)」和「函數(shù)內(nèi)部能訪問到的變量」(也叫環(huán)境)的總和朋截,就是一個(gè)閉包辨泳。

閉包有3個(gè)特性:

①函數(shù)嵌套函數(shù)

②函數(shù)內(nèi)部可以引用函數(shù)外部的參數(shù)和變量

③參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收

閉包的作用

閉包常常用來「間接訪問一個(gè)變量」峦椰。換句話說盾剩,「隱藏一個(gè)變量」出刷。

假設(shè)我們?cè)谧鲆粋€(gè)游戲瘾腰,在寫其中關(guān)于「還剩幾條命」的代碼板鬓。

如果不用閉包悲敷,你可以直接用一個(gè)全局變量:

window.lives = 30 // 還有三十條命

這樣看起來很不妥。萬一不小心把這個(gè)值改成 -1 了怎么辦俭令。所以我們不能讓別人「直接訪問」這個(gè)變量后德。怎么辦呢?

用局部變量抄腔。

但是用局部變量別人又訪問不到瓢湃,怎么辦呢理张?

暴露一個(gè)訪問器(函數(shù)),讓別人可以「間接訪問」绵患。

代碼如下:

```

!function(){

? var lives = 50

? window.獎(jiǎng)勵(lì)一條命 = function(){

? ? lives += 1

? }

? window.死一條命 = function(){

? ? lives -= 1

? }

}()

```


再來看一個(gè)經(jīng)典例子-定時(shí)器與閉包

寫一個(gè)for循環(huán)雾叭,讓它按順序打印出當(dāng)前循環(huán)次數(shù)

再來看一個(gè)經(jīng)典例子-定時(shí)器與閉包

寫一個(gè)for循環(huán),讓它按順序打印出當(dāng)前循環(huán)次數(shù)


按照預(yù)期它應(yīng)該依次輸出1 2 3 4 5落蝙,而結(jié)果它輸出了五次5织狐,這是為什么呢?原來由于js是單線程的筏勒,所以在執(zhí)行for循環(huán)的時(shí)候定時(shí)器setTimeout被安排到任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行移迫,而在等待過程中for循環(huán)就已經(jīng)在執(zhí)行,等到setTimeout可以執(zhí)行的時(shí)候管行,for循環(huán)已經(jīng)結(jié)束厨埋,i的值也已經(jīng)編程5,所以打印出來五個(gè)5捐顷,那么我們?yōu)榱藢?shí)現(xiàn)預(yù)期結(jié)果應(yīng)該怎么改這段代碼呢揽咕?(ps:如果把for循環(huán)里面的var變成let,也能實(shí)現(xiàn)預(yù)期結(jié)果)


引入閉包來保存變量i套菜,將setTimeout放入立即執(zhí)行函數(shù)中,將for循環(huán)中的循環(huán)值i作為參數(shù)傳遞设易,100毫秒后同時(shí)打印出1 2 3 4 5

那如果我們想實(shí)現(xiàn)每隔100毫秒分別依次輸出數(shù)字逗柴,又該怎么改呢?


在這段代碼中,相當(dāng)于同時(shí)啟動(dòng)3個(gè)定時(shí)器顿肺,i*100是為4個(gè)定時(shí)器分別設(shè)置了不同的時(shí)間戏溺,同時(shí)啟動(dòng),但是執(zhí)行時(shí)間不同屠尊,每個(gè)定時(shí)器間隔都是100毫秒旷祸,實(shí)現(xiàn)了每隔100毫秒就執(zhí)行一次打印的效果。

最后總結(jié)一下閉包的好處與壞處

好處

①保護(hù)函數(shù)內(nèi)的變量安全 讼昆,實(shí)現(xiàn)封裝托享,防止變量流入其他環(huán)境發(fā)生命名沖突

②在內(nèi)存中維持一個(gè)變量,可以做緩存(但使用多了同時(shí)也是一項(xiàng)缺點(diǎn)浸赫,消耗內(nèi)存)

③匿名自執(zhí)行函數(shù)可以減少內(nèi)存消耗

壞處

①其中一點(diǎn)上面已經(jīng)有體現(xiàn)了闰围,就是被引用的私有變量不能被銷毀,增大了內(nèi)存消耗既峡,造成內(nèi)存泄漏羡榴,解決方法是可以在使用完變量后手動(dòng)為它賦值為null;

②其次由于閉包涉及跨域訪問运敢,所以會(huì)導(dǎo)致性能損失校仑,我們可以通過把跨作用域變量存儲(chǔ)在局部變量中忠售,然后直接訪問局部變量,來減輕對(duì)執(zhí)行速度的影響

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迄沫,一起剝皮案震驚了整個(gè)濱河市稻扬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邢滑,老刑警劉巖腐螟,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異困后,居然都是意外死亡乐纸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門摇予,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汽绢,“玉大人,你說我怎么就攤上這事侧戴∧眩” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵酗宋,是天一觀的道長(zhǎng)积仗。 經(jīng)常有香客問我,道長(zhǎng)蜕猫,這世上最難降的妖魔是什么寂曹? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮回右,結(jié)果婚禮上隆圆,老公的妹妹穿的比我還像新娘。我一直安慰自己翔烁,他們只是感情好渺氧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蹬屹,像睡著了一般侣背。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上慨默,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天秃踩,我揣著相機(jī)與錄音,去河邊找鬼业筏。 笑死憔杨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒜胖。 我是一名探鬼主播消别,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼抛蚤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了寻狂?” 一聲冷哼從身側(cè)響起岁经,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛇券,沒想到半個(gè)月后缀壤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纠亚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年塘慕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒂胞。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡图呢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骗随,到底是詐尸還是另有隱情蛤织,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布鸿染,位于F島的核電站指蚜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涨椒。R本人自食惡果不足惜摊鸡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丢烘。 院中可真熱鬧,春花似錦些椒、人聲如沸播瞳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赢乓。三九已至,卻和暖如春石窑,著一層夾襖步出監(jiān)牢的瞬間牌芋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工松逊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躺屁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓经宏,卻偏偏與公主長(zhǎng)得像犀暑,于是被迫代替她去往敵國(guó)和親驯击。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容