閉包,看這篇就夠了净蚤!

閉包

首先借用阮老師對閉包(closure)的概念做出的定義:

closure.jpg

在《JavaScript高級程序設計(第3版)》中文版中[3]喇嘱,具體描述在第7章函數表達式第7.2節(jié)(頁碼為第178頁):閉包是指有權訪問另一個函數作用域中的變量的函數。創(chuàng)建閉包的常見方式塞栅,就是在一個函數內部創(chuàng)建另一個函數。

ECMAScript中腔丧,閉包指的是:

  1. 從理論角度:所有的函數放椰。因為它們都在創(chuàng)建的時候就將上層上下文的數據保存起來了。哪怕是簡單的全局變量也是如此愉粤,因為函數中訪問全局變量就相當于是在訪問自由變量砾医,這個時候使用最外層的作用域。

  2. 從實踐角度:以下函數才算是閉包:

    1. 即使創(chuàng)建它的上下文已經銷毀衣厘,它仍然存在(比如如蚜,內部函數從父函數中返回)
    2. 在代碼中引用了自由變量

閉包是怎么保存數據作為緩存數據使用?

無論什么時候在函數中訪問一個變量時影暴,就會從作用域鏈中搜索具有相應名字的變量错邦。一般來講,當函數執(zhí)行完畢后型宙,局部活動對象就會被銷毀撬呢,內存中僅保存全局作用域(全局執(zhí)行環(huán)境的變量對象)。但是閉包的情況又有所不同妆兑,閉包是一個函數捕獲它被定義時所在的環(huán)境魂拦,這個環(huán)境在該函數的引用被銷毀前都是存在的。

demo1:讀取上級作用域的活動變量

function foo() {
  let x = 10;
  // 閉包搁嗓,捕獲`foo`的環(huán)境芯勘。
  // 當foo被調用時,創(chuàng)建foo的執(zhí)行環(huán)境腺逛,初始化變量對象(變量聲明和方法聲明以及參數)
  //當捕捉到bar這個函數聲明時荷愕,會在函數內部創(chuàng)建bar的[[scope]]=foo的活動變量+foo的[[scope]]
  function bar() {
    return x;
  }

  return bar;
}
let x = 20;
// 調用`foo`來返回`bar`閉包。
//當執(zhí)行到這個地方的時候,相當于定義了一個函數bar路翻,bar的[[scope]]=foo的活動變量+foo的[[scope]]
// 只要全局作用域不銷毀狈癞,那么bar的[[scpoe]]就不會銷毀,因此形成閉包(調用的函數foo()執(zhí)行完畢后其執(zhí)行環(huán)境應該銷毀的茂契,但是由于此處的函數表達式而沒有銷毀foo的執(zhí)行環(huán)境即bar的[[scope]]蝶桶,從而形成閉包)
let bar = foo();
bar(); // 10,而不是20!

demo2:讀寫上級作用域的活動變量

function createCounter() {
  let count = 0;
  return {
    increment() { count++; return count; },
    decrement() { count--; return count; },
  };
}
let counter = createCounter();
console.log(
  counter.increment(), // 1
  counter.decrement(), // 0
  counter.increment(), // 1
);
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末掉冶,一起剝皮案震驚了整個濱河市真竖,隨后出現的幾起案子,更是在濱河造成了極大的恐慌厌小,老刑警劉巖恢共,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異璧亚,居然都是意外死亡讨韭,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門癣蟋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來透硝,“玉大人,你說我怎么就攤上這事疯搅”羯” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵幔欧,是天一觀的道長罪治。 經常有香客問我,道長礁蔗,這世上最難降的妖魔是什么觉义? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮浴井,結果婚禮上谁撼,老公的妹妹穿的比我還像新娘。我一直安慰自己滋饲,他們只是感情好厉碟,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屠缭,像睡著了一般箍鼓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呵曹,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天款咖,我揣著相機與錄音何暮,去河邊找鬼。 笑死铐殃,一個胖子當著我的面吹牛海洼,可吹牛的內容都是我干的。 我是一名探鬼主播富腊,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼坏逢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赘被?” 一聲冷哼從身側響起是整,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎民假,沒想到半個月后浮入,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡羊异,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年事秀,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片野舶。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡秽晚,死狀恐怖,靈堂內的尸體忽然破棺而出筒愚,到底是詐尸還是另有隱情,我是刑警寧澤菩浙,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布巢掺,位于F島的核電站,受9級特大地震影響劲蜻,放射性物質發(fā)生泄漏陆淀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一先嬉、第九天 我趴在偏房一處隱蔽的房頂上張望轧苫。 院中可真熱鬧,春花似錦疫蔓、人聲如沸含懊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岔乔。三九已至,卻和暖如春滚躯,著一層夾襖步出監(jiān)牢的瞬間雏门,已是汗流浹背嘿歌。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茁影,地道東北人宙帝。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像募闲,于是被迫代替她去往敵國和親步脓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351