一個故事講閉包

昨天給一位朋友講解閉包伸蚯,講解過程中想到一種故事型的講解方式博秫,朋友聽了直呼內(nèi)行菇篡。

你說的這個朋友到底是不是...

首先看一段簡單到哭的代碼;

const funcA = function () {
  const x = 1;
}

funcA();

console.log('x 是我得不到的人:', x);

由于 x 是 funcA 的局部變量思恐,作用域范圍在 funcA 函數(shù)內(nèi)部,外部的 console 無法訪問 x膊毁。

假如我一定要獲得局部變量 x 呢胀莹?那么可以通過:

const funcA = function () {
  const x = 1;

  return x; // 通過 return 讓 x 躲過被摧毀的命運
}

const x = funcA();

console.log('得到 x 了:', x);

但是上述實現(xiàn)沒有什么私密性可言,這樣方式豈不是讓所有人都可以隨意得到 x 了嗎婚温?如何能夠更加私密的得到 x 描焰?答案就是「閉包」。

一個故事

看一段悲傷到哭的故事:

// 一個溫馨的家
const home = function () {
  const child = 'L'; // 有一個名為 L 的孩子
  const child_home = 'None'; // 孩子還沒有自己的家栅螟,沒有自己的保護殼
  
  return child_home;
};

// child 隨著 home 的結(jié)束而被無情的摧毀
// 但還有一點希望:child_home 通過返回值「活下來」了
const alive = home();

// 但結(jié)局最終是悲傷的:child_home 里空空如也荆秦,只有一個冷冰冰的 None.
// child 沒能幸還
console.log('alive: ', alive);

一個溫馨的家保護著溫室里的花朵:一個正在成長中的孩子。但由于種種原因力图,這個溫馨的家不再溫馨步绸,「家」已經(jīng)結(jié)束了,那個孩子也被徹底摧毀了吃媒。

男淚女淚瓤介!救救孩子吧!

// 一個溫馨的家
const home = function () {
  const child = 'L'; // 有一個名為 L 的孩子

  // 內(nèi)心強大的孩子構(gòu)建了自己的家赘那!
  // child_home 將 child 擁抱入懷中刑桑,
  // 將它「封閉」在了自己的「包」中
  // child_home 是 child 以及其他孩子們的新家
  // 孩子給這個新家起名為「閉包」!
  const child_home = function (check) { 
    const child_inner = child;
    if (check == 'child, it\'s me!') return child_inner;
  }
  
  // return 將為這個新家 child_home 開啟一個避難通道募舟!
  // 在 home 摧毀時
  // child_home 這個「閉包」完整的保護著新家的環(huán)境(函數(shù)上下文)
  // child_home 帶著孩子們(局部變量)逃離了災難現(xiàn)場祠斧!
  return child_home;
};

// home 結(jié)束
// 但 child_home 通過返回值「活下來」了
const alive = home();

// child 也活下來了!
// 而且把自己保護的很好胃珍,需要人臉識別梁肿,才能家訪!
console.log('alive: ', alive('child, it\'s me!'));

孩子最終成長到內(nèi)心足夠強大觅彰,構(gòu)建了自己的新家吩蔑,新家把自己保護起來,形成一個「閉包」填抬,在原始家庭結(jié)束的時候逃離了災難現(xiàn)場烛芬。同時如果有需要,還能把自己保護的很好,即使逃離后也不是任何人都能訪問赘娄。

救出孩子了仆潮!男笑女笑!

總結(jié)

從上面可以知道「閉包」能夠?qū)崿F(xiàn)的兩個核心點:

  • 詞法作用域遣臼。即 home 函數(shù)內(nèi)定義的 child_home 函數(shù)性置,能夠按照代碼書寫的順序,訪問到 home 函數(shù)內(nèi)部且在 child_home 之前定義的變量揍堰。因為詞法作用域的存在鹏浅,child_home 才能把 child 變量封閉保護起來。
  • 函數(shù)作為值傳遞屏歹。由于函數(shù)作為一等公民隐砸,可以像變量一樣被賦值,可以作為值傳遞蝙眶,也可以作為返回值返回季希,所以才能讓函數(shù)這個「閉包」順利逃離災難現(xiàn)場,逃離被摧毀的命運幽纷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末式塌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霹崎,更是在濱河造成了極大的恐慌珊搀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尾菇,死亡現(xiàn)場離奇詭異境析,居然都是意外死亡,警方通過查閱死者的電腦和手機派诬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門劳淆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人默赂,你說我怎么就攤上這事沛鸵。” “怎么了缆八?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵曲掰,是天一觀的道長。 經(jīng)常有香客問我奈辰,道長栏妖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任奖恰,我火速辦了婚禮吊趾,結(jié)果婚禮上宛裕,老公的妹妹穿的比我還像新娘。我一直安慰自己论泛,他們只是感情好揩尸,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屁奏,像睡著了一般岩榆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上了袁,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天朗恳,我揣著相機與錄音,去河邊找鬼载绿。 笑死,一個胖子當著我的面吹牛油航,可吹牛的內(nèi)容都是我干的崭庸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谊囚,長吁一口氣:“原來是場噩夢啊……” “哼怕享!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镰踏,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤函筋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奠伪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跌帐,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年绊率,在試婚紗的時候發(fā)現(xiàn)自己被綠了谨敛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡滤否,死狀恐怖脸狸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情藐俺,我是刑警寧澤炊甲,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站欲芹,受9級特大地震影響卿啡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耀石,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一牵囤、第九天 我趴在偏房一處隱蔽的房頂上張望爸黄。 院中可真熱鬧,春花似錦揭鳞、人聲如沸炕贵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽称开。三九已至,卻和暖如春乓梨,著一層夾襖步出監(jiān)牢的瞬間鳖轰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工扶镀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蕴侣,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓臭觉,卻偏偏與公主長得像昆雀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蝠筑,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345