JavaScript中的閉包

1.什么是閉包

要理解什么是閉包,就得先理解變量的作用域掏颊。
在JavaScript中,有兩種作用域,全局作用域函數(shù)作用域乌叶。

var a=1;
function fn(){
  var b =2;
  console.log(a) 
}
fn.call() // 3
console.log(b) //Uncaught ReferenceError: n is not defined

上面代碼中盆偿,函數(shù)fn可以讀取全局變量a,但是函數(shù)外部無法讀取函數(shù)內(nèi)部聲明的變量b准浴。這就是全局作用域和函數(shù)作用域事扭。

function fn1(){
  var a =1;
  function fn2(){
  console.log(a) 
  }
  return fn2;
}

閉包的官方解釋為,閉包是函數(shù)和聲明該函數(shù)的詞法環(huán)境的組合乐横。
說的比較生僻難懂求橄。通俗些說就是,如果一個函數(shù)使用了函數(shù)作用域范圍外的變量葡公,那么這個函數(shù)和這變量就可以稱為一個閉包罐农。
上面例子中,函數(shù)fn2和變量a就可以稱為一個閉包催什。

2.閉包的用途

閉包的用途主要三個涵亏,讀取函數(shù)內(nèi)部的變量、讓變量始終保留在內(nèi)存中蒲凶、封裝對象的私有屬性和私有方法气筋。

2.1.讀取函數(shù)內(nèi)部變量
function fn1(){
  var a =1;
  function fn2(){
    console.log(a) 
  }
  return fn2;
}
var number =fn1(); // 輸出為1,即可獲取到函數(shù)fn1內(nèi)的變量a旋圆。

上述代碼中宠默,函數(shù)fn1返回值為fn2,fn2可以獲取到fn1的函數(shù)內(nèi)變量灵巧,所以就可以函數(shù)f1的內(nèi)部變量了光稼。

2.2.讓變量始終保留在內(nèi)存中
function fn(x){
  return function(){
    return x++;
  }
}
var number= fn(1);
number.call(); //1
number.call(); //2
number.call(); //3a
2.3.封裝對象的私有屬性和私有方法
function fn(x){
    return function(){
      return x++
    }
}
var a =fn(1);
a();  //1
a();  //2
var b =fn(5);
b();   //5
b();   //6
var c =fn(10);
c();   //10
c();   //11

上述代碼中,外層函數(shù)fn每次運行孩等,都會生成一個新的閉包艾君,而這個閉包又會保留外層函數(shù)的內(nèi)部變量。
a肄方、b冰垄、c 是相互獨立的,函數(shù)fn的內(nèi)部變量參數(shù)x权她,通過閉包虹茶,變成了a、b隅要、c各自的私有變量參數(shù)蝴罪。

3.閉包的缺點

閉包會使函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存占據(jù)很大步清,使用閉包時應(yīng)格外注意內(nèi)存消耗大要门,否則會造成網(wǎng)頁的性能問題虏肾。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市欢搜,隨后出現(xiàn)的幾起案子封豪,更是在濱河造成了極大的恐慌,老刑警劉巖炒瘟,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吹埠,死亡現(xiàn)場離奇詭異,居然都是意外死亡疮装,警方通過查閱死者的電腦和手機缘琅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廓推,“玉大人胯杭,你說我怎么就攤上這事∈苌叮” “怎么了做个?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滚局。 經(jīng)常有香客問我居暖,道長,這世上最難降的妖魔是什么藤肢? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任太闺,我火速辦了婚禮,結(jié)果婚禮上嘁圈,老公的妹妹穿的比我還像新娘省骂。我一直安慰自己,他們只是感情好最住,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布钞澳。 她就那樣靜靜地躺著,像睡著了一般涨缚。 火紅的嫁衣襯著肌膚如雪轧粟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天脓魏,我揣著相機與錄音兰吟,去河邊找鬼。 笑死茂翔,一個胖子當著我的面吹牛混蔼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播珊燎,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼惭嚣,長吁一口氣:“原來是場噩夢啊……” “哼遵湖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起料按,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卓箫,沒想到半個月后载矿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡烹卒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年闷盔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旅急。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡逢勾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出藐吮,到底是詐尸還是另有隱情溺拱,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布谣辞,位于F島的核電站迫摔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泥从。R本人自食惡果不足惜句占,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躯嫉。 院中可真熱鬧纱烘,春花似錦、人聲如沸祈餐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帆阳。三九已至啤它,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舱痘,已是汗流浹背变骡。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芭逝,地道東北人塌碌。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像旬盯,于是被迫代替她去往敵國和親台妆。 傳聞我的和親對象是個殘疾皇子翎猛,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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