簡單理解JS中的閉包

定義一個函數(shù)
<pre>
function fn(a,b,...rest){
var arr;
...
function fn2(){
引用外部函數(shù)fn的參數(shù)a,b...rest和局部變量arr

      };

return fn2;

}

fn();
</pre>

當調(diào)用fn ()這個函數(shù)時叮雳,返回的是fn2()這個函數(shù),fn()的相關(guān)參數(shù)和變量都保存在返回的函數(shù)fn2()中,這種結(jié)構(gòu)就稱為閉包己肮。閉包就是函數(shù)fn2()沫屡,即能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)蛤吓。

a,b...rest,arr這些局部變量在fn()這個函數(shù)外是無法被讀取的披坏,但是有時候又想要讀取這些變量眶根,怎么辦呢逊桦?

在fn的內(nèi)部再定義一個函數(shù)fn2()谈喳,fn2()是可以訪問fn內(nèi)部所有的局部變量的,在內(nèi)部引用局部變量arr钮孵,將fn2()作為返回值骂倘,即可在外面調(diào)用fn的局部變量。

<pre>
function fn() {
var n = 999;
function fn2() {
console.log(n);
}
return f2;
}
var result = fn();
result(); //999
</pre>

調(diào)用fn()時巴席,返回的并不是n的值历涝,而是函數(shù)fn2(),因此我門要在外面將fn賦給一個函數(shù)result,利用調(diào)用result()漾唉;返回的值才是n的值荧库。返回的函數(shù)并沒有立刻執(zhí)行,而是直到調(diào)用了result()才執(zhí)行赵刑。

另一個例子

<pre>
function lazy_sum(arr) {
var sum = function () {
return arr.reduce(function (x, y) {
return x + y;
});
}
return sum;
}
var f = lazy_sum([1, 2, 3, 4, 5]); // function sum()
f(); // 15
</pre>

同樣的分衫,當我們調(diào)用lazy_sum()時,返回的并不是求和結(jié)果般此,而是求和函數(shù)蚪战。調(diào)用函數(shù)f
時,才真正計算求和的結(jié)果铐懊。

當我們調(diào)用lazy_sum()時邀桑,每次調(diào)用都會返回一個新的函數(shù),即使傳入相同的參數(shù):
<pre>var f1 = lazy_sum([1, 2, 3, 4, 5]);
var f2 = lazy_sum([1, 2, 3, 4, 5]);
f1 === f2; // false
</pre>

f1()和f2()的調(diào)用結(jié)果互不影響科乎。

于在JavaScript語言中壁畸,只有函數(shù)內(nèi)部的子函數(shù)才能讀取內(nèi)部變量,因此可以把閉包簡單理解成“定義在一個函數(shù)內(nèi)部的函數(shù)”茅茂。閉包最大的特點捏萍,就是它可以“記住”誕生的環(huán)境,比如fn2記住了它誕生的環(huán)境fn玉吁,所以從fn2可以得到fn的內(nèi)部變量照弥。在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁进副。

閉包的最大用處有兩個这揣,一個是可以讀取函數(shù)內(nèi)部的變量,另一個就是讓這些變量始終保持在內(nèi)存中影斑,即閉包可以使得它誕生環(huán)境一直存在给赞。

內(nèi)存泄露

因為result();一直存在在內(nèi)存中,而result()的存在依賴于fn矫户,因此也始終在內(nèi)存中片迅,不會在調(diào)用結(jié)束后,被垃圾回收機制回收皆辽,內(nèi)存一直得不到釋放柑蛇,JS釋放內(nèi)存時就會漏掉這一部分芥挣,漸漸越積越多,造成內(nèi)存泄露耻台。

返回函數(shù)不要引用任何循環(huán)變量空免,或者后續(xù)會發(fā)生變化的變量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盆耽,一起剝皮案震驚了整個濱河市蹋砚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摄杂,老刑警劉巖坝咐,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異析恢,居然都是意外死亡墨坚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門氮昧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來框杜,“玉大人浦楣,你說我怎么就攤上這事袖肥。” “怎么了振劳?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵椎组,是天一觀的道長。 經(jīng)常有香客問我历恐,道長寸癌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任弱贼,我火速辦了婚禮蒸苇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吮旅。我一直安慰自己溪烤,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布庇勃。 她就那樣靜靜地躺著檬嘀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪责嚷。 梳的紋絲不亂的頭發(fā)上鸳兽,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音罕拂,去河邊找鬼揍异。 笑死全陨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的衷掷。 我是一名探鬼主播烤镐,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棍鳖!你這毒婦竟也來了炮叶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渡处,失蹤者是張志新(化名)和其女友劉穎镜悉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體医瘫,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡侣肄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了醇份。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稼锅。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖僚纷,靈堂內(nèi)的尸體忽然破棺而出矩距,到底是詐尸還是另有隱情,我是刑警寧澤怖竭,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布锥债,位于F島的核電站,受9級特大地震影響痊臭,放射性物質(zhì)發(fā)生泄漏哮肚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一广匙、第九天 我趴在偏房一處隱蔽的房頂上張望允趟。 院中可真熱鬧,春花似錦鸦致、人聲如沸潮剪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲁纠。三九已至,卻和暖如春鳍寂,著一層夾襖步出監(jiān)牢的瞬間改含,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工迄汛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捍壤,地道東北人骤视。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像鹃觉,于是被迫代替她去往敵國和親专酗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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

  • 函數(shù)聲明和函數(shù)表達式有什么區(qū)別 (*)解析器會率先讀取函數(shù)聲明盗扇,并使其在執(zhí)行任何代碼之前可以訪問祷肯;函數(shù)表達式則必須...
    coolheadedY閱讀 388評論 0 1
  • 閉包(closure)是Javascript語言的一個難點,也是它的特色疗隶,很多高級應用都要依靠閉包實現(xiàn)佑笋。 一、變量...
    zock閱讀 1,075評論 2 6
  • 郭芳艷 焦點網(wǎng)絡(luò)五期 堅持原創(chuàng)分享第81天 2017.8.11 假期里總是感覺比上班還忙斑鼻,一個人在家...
    冰山藍鷹閱讀 91評論 0 0
  • 小朋友們蒋纬,你們知道嗎?中國五岳名山有哪些坚弱?有東岳泰山蜀备,南岳衡山,北岳恒山荒叶,西岳華山碾阁,中岳嵩山。你們知道...
    fdeceb686cba閱讀 575評論 0 0
  • 今天在做一個menu的時候停撞,需要改動item的高度和字體大小顏色瓷蛙。搜索了一下很多方法都不管用,最后是結(jié)合了 sta...
    seven_Android閱讀 8,069評論 4 3