JS-讀懂閉包

長久以來三幻,閉包是前端同學(xué)面試必考的問題。會用閉包也成了高級前端開發(fā)者的標志呐能,今天就來徹底弄清楚閉包的每一個細節(jié)念搬。

1.閉包是什么?

比較官方的定義是:一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數(shù))摆出,因而這些變量也是該表達式的一部分朗徊。

我個人的簡化理解是:閉包就是函數(shù)及函數(shù)上下文環(huán)境的集合。上下文可以理解為函數(shù)可以訪問到的所有變量偎漫。

很多人肯定這樣寫過JavaScript代碼:

var paramA = "test";
var functionA = function(){
  console.log(paramA);
}

這樣寫其實就是使用了閉包的概念爷恳,只是很多人并沒有意識到這是閉包。這段代碼值得注意的地方是函數(shù)functionA內(nèi)部調(diào)用了函數(shù)外的變量paramA象踊。這就是閉包的鮮明特征温亲。

2.為什么會有閉包棚壁?

閉包是JavaScript鏈式作用域的副產(chǎn)品。閉包不是JavaScript獨有的特性铸豁,和JavaScript有類似作用域設(shè)計的語言也存在閉包灌曙,比如Python。

鏈式作用域的設(shè)計決定了子作用域中的函數(shù)可以訪問到父級作用域的變量节芥,嵌套函數(shù)可以訪問到外部函數(shù)的變量在刺。

借用一張圖來說明一下JavaScript的鏈式作用域。


圖片來自王福朋博客http://www.cnblogs.com/wangfupeng1988/p/3994065.html
3.閉包如何使用头镊?

前面的小例子雖然體現(xiàn)了閉包的特征蚣驼,但并不是一個真正的閉包函數(shù)∠嗤В看下面這個例子:

function a() { 
 var i = 0; 
 function b() { console.log(i++); } 
 return b;
}
var c = a();
c();

這里函數(shù)b就是一個閉包函數(shù)颖杏,那為什么要用c去調(diào)用函數(shù)a呢?這是為了防止JavaScript的垃圾回收機制生效坛芽。在Javascript中留储,如果一個對象不再被引用,那么這個對象就會被GC回收咙轩。如果兩個對象互相引用获讳,而不再被第3者所引用,那么這兩個互相引用的對象也會被回收活喊。因為函數(shù)a被b引用丐膝,a又被c引用。這樣函數(shù)a和b才不會被回收钾菊。

4.閉包有什么作用帅矗?

我認為閉包的主要作用有兩點:
1.保持變量常駐內(nèi)存,不被回收煞烫。
2.實現(xiàn)私有的方法和屬性浑此,禁止外部訪問。

第一點很好理解滞详,比如上面的例子中i就會常駐內(nèi)存尤勋,每次執(zhí)行c函數(shù)都會得到i的值。這種情況很常見茵宪,比如游戲中的的的分數(shù)等最冰。

第二點是閉包最重要的用處,還是以上面的例子來說稀火。i是函數(shù)a的局部變量暖哨,如果想修改i的值,只有調(diào)用函數(shù)b。其他外部函數(shù)是無法訪問到變量i的篇裁,這樣就保證了變量i的安全沛慢。

5.閉包的缺點

事物都有兩面性,閉包在帶來方便的同時也有一些弊端达布。

因為閉包函數(shù)會使變量常駐內(nèi)存团甲,如果使用不當。比如在循環(huán)中使用閉包黍聂,有可能導(dǎo)致內(nèi)存壓力過大躺苦。

在IE中會導(dǎo)致內(nèi)存泄漏,這是IE的bug并不是閉包的問題产还。

6.我的觀點

我猜測閉包是JavaScript在設(shè)計之初未曾想到過的用法匹厘,如果業(yè)務(wù)中沒有強烈的需求,盡量不要使用閉包脐区。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末愈诚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牛隅,更是在濱河造成了極大的恐慌炕柔,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒佣,死亡現(xiàn)場離奇詭異匕累,居然都是意外死亡,警方通過查閱死者的電腦和手機丈攒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來授霸,“玉大人巡验,你說我怎么就攤上這事〉舛” “怎么了显设?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辛辨。 經(jīng)常有香客問我捕捂,道長,這世上最難降的妖魔是什么斗搞? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任指攒,我火速辦了婚禮,結(jié)果婚禮上僻焚,老公的妹妹穿的比我還像新娘允悦。我一直安慰自己,他們只是感情好虑啤,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布隙弛。 她就那樣靜靜地躺著架馋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪全闷。 梳的紋絲不亂的頭發(fā)上叉寂,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音总珠,去河邊找鬼屏鳍。 笑死,一個胖子當著我的面吹牛姚淆,可吹牛的內(nèi)容都是我干的孕蝉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼腌逢,長吁一口氣:“原來是場噩夢啊……” “哼降淮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搏讶,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佳鳖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后媒惕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體系吩,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年妒蔚,在試婚紗的時候發(fā)現(xiàn)自己被綠了穿挨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡肴盏,死狀恐怖科盛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菜皂,我是刑警寧澤贞绵,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站恍飘,受9級特大地震影響榨崩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜章母,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一母蛛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乳怎,春花似錦溯祸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽博杖。三九已至,卻和暖如春筷登,著一層夾襖步出監(jiān)牢的瞬間剃根,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工前方, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狈醉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓惠险,卻偏偏與公主長得像苗傅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子班巩,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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

  • 閉包(closure)是Javascript語言的一個難點渣慕,也是它的特色,很多高級應(yīng)用都要依靠閉包實現(xiàn)抱慌。 一逊桦、變量...
    zock閱讀 1,075評論 2 6
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券抑进,享受所有官網(wǎng)優(yōu)惠强经,并抽取幸運大...
    HetfieldJoe閱讀 5,610評論 16 88
  • 閉包: 官方”的解釋是:閉包是一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數(shù)),因而這些變量也是該...
    小裁縫sun閱讀 618評論 0 5
  • 你在遠方 在那人心上作案 肆無忌憚的犯罪 但更像是自衛(wèi) 無心過錯 罪行于你輕如鴻毛 路人看到你對那人動粗 對那人辱...
    樹來閱讀 333評論 1 3
  • 打開簡書這個軟件寺渗,第一次接觸匿情,但很喜歡,也很喜歡看里面大家發(fā)表的一些文章信殊,可以自己寫東西炬称。雖然我寫作談不上什么水平...
    墨守成香閱讀 103評論 1 1