JavaScript高級程序設計讀書筆記之閉包

ps:如無說明款侵,下文中的“書”特指JavaScript高級程序設計這本書。

閉包:JavaScript高級程序設計這本書里,針對閉包總結了一句話,這句話是:閉包是指有權訪問另一個函數(shù)作用域中的變量的函數(shù)棘钞。

這應該就是閉包最基本的概念,要想理解閉包资溃,就必須先理解這句話武翎,而理解這句話烈炭,就必須先搞清楚這句話中的幾個重要的點溶锭。

在這句話中,有這樣幾個名詞符隙,變量趴捅、函數(shù)、函數(shù)作用域霹疫。咱們就先搞清楚這幾個名詞是什么意思拱绑。還是翻JavaScript高級程序設計這本書

1、變量:ECMAScript中的變量是松散類型的丽蝎,所為松散類型就是可以用來保存任何類型的數(shù)據猎拨。換句話說,每個變量僅僅是一個用于保存值的占位符而已屠阻。

2红省、函數(shù):函數(shù)是一個核心概念,通過函數(shù)可以封裝任意多條語句国觉,而且可以在任何地方吧恃、任何時候調用執(zhí)行。ECMAScript中的函數(shù)使用function關鍵字來聲明麻诀,后跟一組參數(shù)以及函數(shù)體痕寓。

3傲醉、函數(shù)作用域:書中對于作用域的描述有很多,都寫出來會有更多名詞需要理解呻率。這里只簡單說一說對理解閉包有用的東西硬毕。函數(shù)作用域是指在一個函數(shù)中,你聲明的變量只能在這個函數(shù)里面訪問到筷凤,比如:

function a(){

? ? var b = 0;

? ? console.log(b);

}

a(); //輸出0

console.log(b); //報錯昭殉,b is not defined

function c(){

? ? console.log(b);

}

c(); //報錯,b is not defined

上面的例子告訴我們藐守,在一個函數(shù)里面定義的變量挪丢,在函數(shù)外面是無法訪問的,在另一個函數(shù)里面卢厂,也是無法訪問的乾蓬。

但是書中對閉包的描述是,有權訪問另一個函數(shù)作用域中的變量的函數(shù)慎恒,就是閉包任内。那要怎么做才能讓一個函數(shù)訪問另一個函數(shù)的作用域中的變量呢?

書中說的方法是:創(chuàng)建閉包的常見方式融柬,就是在一個函數(shù)內部創(chuàng)建另一個函數(shù)死嗦。咱們來試一試。

首先創(chuàng)建一個函數(shù)

function a(){

? ? //聲明一個變量

? ? var b = 0;

? ? //在函數(shù)a()內部再創(chuàng)建一個函數(shù)

? ? return function(){

? ? ? ?console.log(b);

? ? }

}

var d = a();

var result = d(); //輸出0粒氧,這樣我們就訪問到了在函數(shù)a()里聲明的變量b

如果要徹底說明白越除,就要引入更多的名詞,比如變量對象外盯、執(zhí)行環(huán)境摘盆、作用域鏈等等。很復雜饱苟,也不一定非要掌握孩擂,但是理解了這些對提升水平有很大幫助。在這里都說明白的話要很多篇幅箱熬。這里我只簡單說一下我的理解类垦。

在這個例子中,函數(shù)a的作用域鏈包含兩個作用域城须,一個是全局作用域蚤认,一個是函數(shù)a()的局部作用域,在函數(shù)a()執(zhí)行完畢后酿傍,函數(shù)a()的局部作用域就被銷毀了烙懦,內存中只保留全局作用域。但是,函數(shù)a()在執(zhí)行的時候還返回了一個匿名函數(shù)氯析,這個匿名函數(shù)的作用域鏈包含了三個作用域亏较,從先后順序來說的話,即:匿名函數(shù)本身的作用域掩缓,函數(shù)a()的作用域雪情,以及全局作用域,在匿名函數(shù)執(zhí)行的時候你辣,先搜索本身的作用域巡通,沒有發(fā)現(xiàn)變量b,然后搜索函數(shù)a()的作用域舍哄,發(fā)現(xiàn)了變量b宴凉,把變量b打印出來,不再搜索全局作用域表悬。如果在函數(shù)a()里沒有找到變量b的話弥锄,就會繼續(xù)搜索全局作用域,如果找到變量b則打印蟆沫,沒有找到則報錯籽暇,b is not defined. 匿名函數(shù)一直在引用著函數(shù)a()的作用域,所以函數(shù)a()的作用域鏈不會被銷毀饭庞,它的作用域也就一直存在內存中戒悠。因此我們需要手動解除引用,銷毀函數(shù)a()的作用域鏈舟山,釋放內存绸狐。也由于閉包會攜帶包含它的函數(shù)的作用域,因此會比其他函數(shù)占用更多的內存捏顺。過度使用閉包會導致內存占用過多六孵,所以盡量在必要的時候才使用閉包纬黎。

d = null;

d(); //報錯幅骄,b is not defined

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市本今,隨后出現(xiàn)的幾起案子拆座,更是在濱河造成了極大的恐慌,老刑警劉巖冠息,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挪凑,死亡現(xiàn)場離奇詭異,居然都是意外死亡逛艰,警方通過查閱死者的電腦和手機躏碳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來散怖,“玉大人菇绵,你說我怎么就攤上這事肄渗。” “怎么了咬最?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵翎嫡,是天一觀的道長。 經常有香客問我永乌,道長惑申,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任翅雏,我火速辦了婚禮圈驼,結果婚禮上,老公的妹妹穿的比我還像新娘望几。我一直安慰自己碗脊,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布橄妆。 她就那樣靜靜地躺著衙伶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪害碾。 梳的紋絲不亂的頭發(fā)上矢劲,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音慌随,去河邊找鬼芬沉。 笑死,一個胖子當著我的面吹牛阁猜,可吹牛的內容都是我干的丸逸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼剃袍,長吁一口氣:“原來是場噩夢啊……” “哼黄刚!你這毒婦竟也來了?” 一聲冷哼從身側響起民效,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤憔维,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畏邢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體业扒,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年舒萎,在試婚紗的時候發(fā)現(xiàn)自己被綠了程储。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖章鲤,靈堂內的尸體忽然破棺而出致板,到底是詐尸還是另有隱情,我是刑警寧澤咏窿,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布斟或,位于F島的核電站,受9級特大地震影響集嵌,放射性物質發(fā)生泄漏萝挤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一根欧、第九天 我趴在偏房一處隱蔽的房頂上張望怜珍。 院中可真熱鬧,春花似錦凤粗、人聲如沸酥泛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柔袁。三九已至,卻和暖如春异逐,著一層夾襖步出監(jiān)牢的瞬間捶索,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工灰瞻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腥例,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓酝润,卻偏偏與公主長得像燎竖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子要销,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容

  • 前言 有很多人搞不清匿名函數(shù)和閉包這兩個概念构回,經常混用蕉陋。閉包是指有權訪問另一個函數(shù)作用域中的變量的函數(shù)捐凭。匿名函數(shù)就...
    cduyzh閱讀 598評論 3 7
  • 閉包(closure)是Javascript語言的一個難點拨扶,也是它的特色凳鬓,很多高級應用都要依靠閉包實現(xiàn)。 一患民、變量...
    zock閱讀 1,075評論 2 6
  • 會成為朋友缩举,是因為三觀相近。性格相似或互補。 明明是金牛座的我仅孩,被人誤會以為是水瓶座托猩。我越來越愛胡思亂想玻璃心。然...
    珮琦琦琦閱讀 304評論 2 2
  • 小學辽慕,你哭了京腥,整個班級 老師 圍過來問你怎么了;初中溅蛉,你難過公浪,很多同學都來安慰你;高中船侧,只有幾個死黨摸摸你欠气,告訴你...
    篤學青衿閱讀 133評論 0 0
  • 邊上的同事在放動感音樂预柒,以致我根本無法專心的復盤,說好的晚上復盤呢袁梗? 因為老公回來宜鸯,打亂了原有...
    小茹老師閱讀 133評論 0 0