閉包的理解

先寫段代碼舉例

var aa = '1'
function bb() {
    console.log(aa)
}

上面代碼就是一個閉包昼伴。

如果一個函數(shù),使用了它范圍外的變量监透,那么(這個函數(shù)+這個變量)就叫做閉包

閉包的兩大好處:

  • 一個可以讀取函數(shù)內(nèi)部的變量
  • 另一個就是讓這些變量的值始終保持在內(nèi)存中
    閉包一般伴隨著函數(shù)嵌套避凝,有時候要得到函數(shù)內(nèi)的局部變量社痛,就需要在函數(shù)內(nèi)部再定義一個函數(shù)

1.讀取函數(shù)內(nèi)部的變量

function f1() {    
    var n = 100;    
    function f2() {      
        console.log(n);    
    }    
    return f2;  
}  
var result = f1();  
result(); // 100

上面代碼中,f2被嵌套在f1內(nèi)部水醋,f1的全部變量旗笔,f2都是可以訪問的。但是反過來不行拄踪。所有我們可以把f2作為返回值蝇恶,這樣f1就可以訪問了。

2.變量的值始終保持在內(nèi)存中

function f1(){
  var n=999;
  nAdd=function(){n+=1}
  function f2(){
    console.log(n);
  }
  return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000

f2是一個嵌套函數(shù)的閉包宫蛆,執(zhí)行了兩次艘包,第一次值是999,第二次是1000.證明了函數(shù)f1的局部變量n一直保存在內(nèi)存中耀盗,沒有在f1調用后清除想虎。
因為 f1f2的父函數(shù),f2被賦給了一個全局變量n叛拷,導致f2一直在內(nèi)存中舌厨,因為f2f1中,故f1也在內(nèi)存中忿薇。(內(nèi)存回收是沒有任何地方用到這個變量或者函數(shù)裙椭,那么就被回收)躏哩。
其中nAdd沒有用var定義,是個全局變量揉燃。nAdd后面的函數(shù)是匿名函數(shù)也是一個閉包扫尺,nAdd相當于一個setter,可以在函數(shù)外部對函數(shù)內(nèi)部的局部變量進行操作炊汤。

兩個例子

var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    return function(){
      return this.name;
    };
  }
};
console.log(object.getNameFunc()()); //The Window
var name = "The Window";
var object = {
  name : "My Object",
  getNameFunc : function(){
    var that = this;
    return function(){
      return that.name;
    };
  }
};
console.log(object.getNameFunc()());  //My Object
參考文檔:

1.https://zhuanlan.zhihu.com/p/22465092
2.http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末正驻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抢腐,更是在濱河造成了極大的恐慌姑曙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迈倍,死亡現(xiàn)場離奇詭異伤靠,居然都是意外死亡,警方通過查閱死者的電腦和手機啼染,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門宴合,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人迹鹅,你說我怎么就攤上這事形纺。” “怎么了徒欣?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜗字。 經(jīng)常有香客問我打肝,道長,這世上最難降的妖魔是什么挪捕? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任粗梭,我火速辦了婚禮,結果婚禮上级零,老公的妹妹穿的比我還像新娘断医。我一直安慰自己,他們只是感情好奏纪,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布鉴嗤。 她就那樣靜靜地躺著,像睡著了一般序调。 火紅的嫁衣襯著肌膚如雪醉锅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天发绢,我揣著相機與錄音硬耍,去河邊找鬼垄琐。 笑死,一個胖子當著我的面吹牛经柴,可吹牛的內(nèi)容都是我干的狸窘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坯认,長吁一口氣:“原來是場噩夢啊……” “哼翻擒!你這毒婦竟也來了?” 一聲冷哼從身側響起鹃操,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤韭寸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荆隘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恩伺,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年椰拒,在試婚紗的時候發(fā)現(xiàn)自己被綠了晶渠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡燃观,死狀恐怖褒脯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缆毁,我是刑警寧澤番川,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站脊框,受9級特大地震影響颁督,放射性物質發(fā)生泄漏。R本人自食惡果不足惜浇雹,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一沉御、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昭灵,春花似錦吠裆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窜护,卻和暖如春效斑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工缓屠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奇昙,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓敌完,卻偏偏與公主長得像储耐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子滨溉,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 閉包(closure)是Javascript語言的一個難點什湘,也是它的特色,很多高級應用都要依靠閉包實現(xiàn)晦攒。 一闽撤、變量...
    zouCode閱讀 1,271評論 0 13
  • 閉包:從字面意思來理解就是封閉和包裹,換句話說脯颜,就是在函數(shù)內(nèi)部定義的變量哟旗,在函數(shù)的外部無法訪問到,因此就說函數(shù)構成...
    清葉閱讀 555評論 1 0
  • 閉包(closure)是Javascript語言的一個難點栋操,也是它的特色闸餐,很多高級應用都要依靠閉包實現(xiàn)。 一矾芙、變量...
    zock閱讀 1,075評論 2 6
  • 接觸過JS的同學們一定都知道閉包這個名詞舍沙,在我剛開始學習JS的時候,閉包對于我是一個很高大上很難理解的存在剔宪,今天終...
    W北落師門W閱讀 264評論 0 1
  • 每天出來拂铡,上班,下班葱绒,我看到都是墻壁和媳,還有在墻壁的縫隙中生存的人們,我多么渴望哈街,如饑似渴地想要看到?jīng)]有盡頭天空,窮...
    一根蘆葦?shù)乃秸Z閱讀 197評論 0 0