閉包

閉包包含自由(未綁定到特定對象)變量;這些變量不是在這個代碼塊內(nèi)或者任何全局上下文中定義的访递,而是在定義代碼塊的環(huán)境中定義(局部變量)。"閉包" 一詞來源于以下兩者的結(jié)合:要執(zhí)行的代碼塊(由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放)和為自由變量提供綁定的計算環(huán)境(作用域)汽煮。在PHP、Scala棚唆、Scheme暇赤、Common Lisp、Smalltalk宵凌、Groovy鞋囊、JavaScript、Ruby瞎惫、 Python溜腐、Go、Lua瓜喇、objective c挺益、swift 以及Java(Java8及以上)等語言中都能找到對閉包不同程度的支持。

一句話可以概括:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)乘寒,或者子函數(shù)在外調(diào)用望众,子函數(shù)所在的父函數(shù)的作用域不會被釋放。

  • 變量作用域
    一個變量的作用域(scope)是程序源代碼中定義這個變量的區(qū)域肃续。 全局變量擁有全局作用域黍檩,在javaScript代碼中任何地方都有定義的。 然而在函數(shù)內(nèi)聲明的變量只是在函數(shù)內(nèi)部有定義,他們是局部變量,作用域也只是在局部载城。
    在函數(shù)體內(nèi),局部變量的優(yōu)先級要高于全局變量棵里。如果在函數(shù)體內(nèi)重新聲明一個與局部變量重名的變量润文,局部變量就會覆蓋全局變量的值。
    在函數(shù)內(nèi)部聲明變量的時候殿怜,一定要使用var命令典蝌。如果不用的話,你實際上聲明的是一個全局變量头谜。
  • 外部讀取函數(shù)內(nèi)部的局部變量
function f1 () {
  var n = 999;
  function f2 () {
    alert(n);
  }
  return f2;
}
var result = f1();
result(); //999
  • 內(nèi)存回收機(jī)制
    JS的垃圾回收機(jī)制是為了以防內(nèi)存泄漏骏掀,內(nèi)存泄漏的含義就是當(dāng)已經(jīng)不需要某塊內(nèi)存時這塊內(nèi)存還存在著,垃圾回收機(jī)制就是間歇的不定期的尋找到不再使用的變量柱告,并釋放掉它們所指向的內(nèi)存截驮。
    f1是f2的父函數(shù),而f2被賦給了一個全局變量际度,這導(dǎo)致f2始終在內(nèi)存中葵袭,而f2的存在依賴于f1,因此f1也始終在內(nèi)存中乖菱,不會在調(diào)用結(jié)束后坡锡,被內(nèi)存回收機(jī)制回收。
function f1 () {
  var n = 999;
  nAdd = function () {n+=1}
  function f2 () {
    alert(n);
  }
  return f2;
}
var result = f1();
result(); //999
nAdd();
result(); //1000

這段代碼中另一個值得注意的地方窒所,就是"nAdd=function(){n+=1}"這一行鹉勒,首先在nAdd前面沒有使用var關(guān)鍵字,因此nAdd是一個全局變量墩新,而不是局部變量贸弥。其次,nAdd的值是一個匿名函數(shù)海渊,而這個匿名函數(shù)本身也是一個閉包,所以nAdd相當(dāng)于是一個setter哲鸳,可以在函數(shù)外部對函數(shù)內(nèi)部的局部變量進(jìn)行操作臣疑。

  • 閉包的用途
    1. 讀取函數(shù)內(nèi)部的變量
    2. 讓變量的值始終保持在內(nèi)存中,不會在f1調(diào)用后被自動清除
  • 使用閉包需要注意的問題
    1. 由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中徙菠,內(nèi)存消耗很大讯沈,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題婿奔,在IE中可能導(dǎo)致內(nèi)存泄露缺狠。解決方法是,在退出函數(shù)之前萍摊,將不使用的局部變量全部刪除挤茄。
    2. 閉包會在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值冰木。所以穷劈,如果你把父函數(shù)當(dāng)作對象(object)使用笼恰,把閉包當(dāng)作它的公用方法,把內(nèi)部變量當(dāng)作它的私有屬性歇终,這時一定要小心社证,不要隨便改變父函數(shù)內(nèi)部變量的值。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末评凝,一起剝皮案震驚了整個濱河市追葡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌奕短,老刑警劉巖宜肉,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異篡诽,居然都是意外死亡崖飘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門杈女,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朱浴,“玉大人,你說我怎么就攤上這事达椰『泊溃” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵啰劲,是天一觀的道長梁沧。 經(jīng)常有香客問我,道長蝇裤,這世上最難降的妖魔是什么廷支? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮栓辜,結(jié)果婚禮上恋拍,老公的妹妹穿的比我還像新娘。我一直安慰自己藕甩,他們只是感情好施敢,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狭莱,像睡著了一般僵娃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腋妙,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天默怨,我揣著相機(jī)與錄音,去河邊找鬼辉阶。 笑死先壕,一個胖子當(dāng)著我的面吹牛瘩扼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播垃僚,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼集绰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谆棺?” 一聲冷哼從身側(cè)響起栽燕,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎改淑,沒想到半個月后碍岔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡朵夏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年蔼啦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仰猖。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡捏肢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饥侵,到底是詐尸還是另有隱情鸵赫,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布躏升,位于F島的核電站辩棒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏膨疏。R本人自食惡果不足惜一睁,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佃却。 院中可真熱鬧卖局,春花似錦、人聲如沸双霍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洒闸。三九已至,卻和暖如春均芽,著一層夾襖步出監(jiān)牢的瞬間丘逸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工掀宋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留深纲,地道東北人仲锄。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像湃鹊,于是被迫代替她去往敵國和親儒喊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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

  • ● 閉包基礎(chǔ) ● 閉包作用 ● 閉包經(jīng)典例子 ● 閉包應(yīng)用 ● 閉包缺點 ● 參考資料 1币呵、閉包基礎(chǔ) 作用域和作...
    lzyuan閱讀 921評論 0 0
  • 閉包(closure)是Javascript語言的一個難點怀愧,也是它的特色,很多高級應(yīng)用都要依靠閉包實現(xiàn)余赢。 一芯义、變量...
    風(fēng)蕭蕭易水寒_1196閱讀 256評論 0 0
  • 閉包(closure)是Javascript語言的一個難點,也是它的特色妻柒,很多高級應(yīng)用都要依靠閉包實現(xiàn)扛拨。 一、變量...
    zouCode閱讀 1,270評論 0 13
  • 一举塔、變量的作用域 要懂得閉包绑警,起首必須懂得Javascript特別的變量作用域。 變量的作用域無非就是兩種:全局變...
    杭州程序員小陳閱讀 211評論 0 0
  • 文|汝之尾巴草 -01- 又一次背著那個舊舊的背包走在了路上章郁,沒人陪伴,沒人說話志衍。外面飄著雪暖庄,正好是今年的第一場雪...
    汝之尾巴草閱讀 2,817評論 162 143