js閉包

閉包的作用

閉包簡(jiǎn)單來(lái)說(shuō)就是函數(shù)中的函數(shù)牛曹,也可以把它理解為一種現(xiàn)象渴杆,就是說(shuō)一個(gè)函數(shù)要訪問另外一個(gè)目標(biāo)函數(shù)內(nèi)部的變量崭捍,就要在目標(biāo)函數(shù)中再定義一個(gè)函數(shù)(以此來(lái)把作用域鏈往下延長(zhǎng)一段,目的就是為了利用js在找自由變量時(shí),會(huì)沿著作用域鏈一級(jí)一級(jí)往上找的特點(diǎn))泞遗,并將這個(gè)定義的函數(shù)return出來(lái),供外部使用倔监。在實(shí)際開發(fā)中直砂,閉包主要是用來(lái)封裝變量,收斂權(quán)限浩习。

例子

function isFirstLoad(){
           var list=[];
           return function(option){
               if(list.indexOf(option)>=0){
                   console.log('已存在')
               }else{
                   list.push(option);
                   console.log('首次傳入'); 
               }
           }
       }

var ifl=isFirstLoad();
ifl("winter"); 
ifl("dongodng");
ifl("winter");

可以看到訪問內(nèi)部函數(shù)的變量只能通過(guò)定義的isFirstLoad來(lái)訪問静暂,閉包的好處就是引用的作用域不會(huì)被方式做垃圾回收處理,當(dāng)然不合理的使用會(huì)很耗費(fèi)內(nèi)存谱秽。

作用域洽蛀、作用域鏈、調(diào)用對(duì)象

詞法作用域是函數(shù)定義時(shí)的作用域疟赊,即靜態(tài)作用域郊供。當(dāng)一個(gè)函數(shù)定義時(shí),他的詞法作用域就確定了近哟,詞法作用域說(shuō)明的是在函數(shù)結(jié)構(gòu)的嵌套關(guān)系下驮审,函數(shù)作用的范圍。這個(gè)時(shí)候也就形成了該函數(shù)的作用域鏈吉执。作用域鏈就是把這些具有嵌套層級(jí)關(guān)系的作用域串聯(lián)起來(lái)疯淫。函數(shù)的內(nèi)部[[scope]]屬性指向了該作用域鏈。
  動(dòng)態(tài)作用域是函數(shù)調(diào)用執(zhí)行時(shí)的作用域戳玫。當(dāng)一個(gè)函數(shù)被調(diào)用時(shí)熙掺,首先將函數(shù)內(nèi)部[[scope]]屬性指向了函數(shù)的作用域鏈,然后會(huì)創(chuàng)建一個(gè)調(diào)用對(duì)象咕宿,并用該調(diào)用對(duì)象記錄函數(shù)參數(shù)和函數(shù)的局部變量适掰,將其置于作用域鏈頂部。動(dòng)態(tài)作用域就是通過(guò)把該調(diào)用對(duì)象加到作用域鏈的頂部來(lái)創(chuàng)建的荠列,此時(shí)的[[scope]]除了具有定義時(shí)的作用域鏈类浪,還具有了調(diào)用時(shí)創(chuàng)建的調(diào)用對(duì)象。換句話說(shuō)肌似,執(zhí)行環(huán)境下的作用域等于該函數(shù)定義時(shí)就確定的作用域鏈加上該函數(shù)剛剛創(chuàng)建的調(diào)用對(duì)象费就,從而也形成了新的作用域鏈。所以說(shuō)是動(dòng)態(tài)的作用域川队,并且作用域鏈也隨之發(fā)生了變化力细。再看這里的作用域,其實(shí)是一個(gè)對(duì)象鏈固额,這些對(duì)象就是函數(shù)調(diào)用時(shí)創(chuàng)建的調(diào)用對(duì)象眠蚂,以及他上面一層層的調(diào)用對(duì)象直到最上層的全局對(duì)象《孵铮 
  譬如全局環(huán)境下的函數(shù)A內(nèi)嵌套了一個(gè)函數(shù)B逝慧,則該函數(shù)B的作用域鏈就是:函數(shù)B的作用域—>函數(shù)A的作用域—>全局window的作用域。當(dāng)函數(shù)B調(diào)用時(shí),尋找某標(biāo)識(shí)符笛臣,會(huì)按函數(shù)B的作用域—>函數(shù)A的作用域—>全局window的作用域去尋找云稚,實(shí)際上是按函數(shù)B的調(diào)用對(duì)象—>函數(shù)A的調(diào)用對(duì)象—>全局對(duì)象這個(gè)順序去尋找的。也就是說(shuō)當(dāng)函數(shù)調(diào)用時(shí)沈堡,函數(shù)的作用域鏈實(shí)際上是調(diào)用對(duì)象鏈静陈。

延長(zhǎng)變量的壽命

除了變量的作用域,另外一個(gè)和閉包有著親密關(guān)系的就是變量的生存周期了诞丽。一般來(lái)說(shuō)鲸拥,全局變量的生存周期是永久的,直到我們主動(dòng)銷毀僧免。而在函數(shù)內(nèi)不用var關(guān)鍵字聲明的局部變量來(lái)說(shuō)刑赶,當(dāng)退出函數(shù)時(shí),這些函數(shù)變量立即失去它們的價(jià)值猬膨,也就被垃圾回收機(jī)制銷毀了角撞,也算壽終正寢〔眨可是在閉包中谒所,卻不是這樣。

      var a = 1; 
      a++;
      console.log(a);
}; 
func();  
func();  
func();  
image.png

可以看到a變量在函數(shù)結(jié)束的時(shí)候就已經(jīng)被銷毀了沛申。

      var a = 1;
      return function(){  //匿名函數(shù)
            a++;
            console.log(a);
      }
};
var f = func(); 
f();  
f();  
f();  
f();   
image.png

可以看到閉包中的變量在函數(shù)結(jié)束的時(shí)候依然存在劣领,保存在內(nèi)存中,可以繼續(xù)訪問到铁材,這就實(shí)現(xiàn)了變量的分裝和復(fù)用尖淘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市著觉,隨后出現(xiàn)的幾起案子村生,更是在濱河造成了極大的恐慌,老刑警劉巖饼丘,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趁桃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肄鸽,警方通過(guò)查閱死者的電腦和手機(jī)卫病,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)典徘,“玉大人蟀苛,你說(shuō)我怎么就攤上這事〈澹” “怎么了帜平?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵幽告,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我罕模,道長(zhǎng)评腺,這世上最難降的妖魔是什么帘瞭? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任淑掌,我火速辦了婚禮,結(jié)果婚禮上蝶念,老公的妹妹穿的比我還像新娘抛腕。我一直安慰自己,他們只是感情好媒殉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布担敌。 她就那樣靜靜地躺著,像睡著了一般廷蓉。 火紅的嫁衣襯著肌膚如雪全封。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天桃犬,我揣著相機(jī)與錄音刹悴,去河邊找鬼。 笑死攒暇,一個(gè)胖子當(dāng)著我的面吹牛土匀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播形用,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼就轧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了田度?” 一聲冷哼從身側(cè)響起妒御,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镇饺,沒想到半個(gè)月后乎莉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兰怠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年梦鉴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揭保。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肥橙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秸侣,到底是詐尸還是另有隱情存筏,我是刑警寧澤宠互,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站椭坚,受9級(jí)特大地震影響予跌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜善茎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一券册、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垂涯,春花似錦烁焙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至操骡,卻和暖如春九火,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背册招。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工岔激, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跨细。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓鹦倚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冀惭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子震叙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 談起閉包媒楼,它可是JavaScript兩個(gè)核心技術(shù)之一(異步和閉包),在面試以及實(shí)際應(yīng)用當(dāng)中,我們都離不開它們戚丸,甚至...
    sponing閱讀 677評(píng)論 0 7
  • 閉包(closure)是Javascript語(yǔ)言的一個(gè)難點(diǎn)划址,也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)限府。 一夺颤、變量...
    zock閱讀 1,075評(píng)論 2 6
  • 閉包: 官方”的解釋是:閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù)),因而這些變量也是該...
    小裁縫sun閱讀 610評(píng)論 0 5
  • 究竟什么是閉包? 閉包在什么場(chǎng)景下使用署穗? 寫前端程序需要用到閉包嗎寥裂?我用jQuery也能寫的好好滴呀嵌洼? 對(duì)于初學(xué)者...
    佩吉秋閱讀 17,442評(píng)論 9 111
  • 夏雨過(guò)后,院壩里突然來(lái)了一條不知名的蟲封恰,這蟲全身烏黑亮麗麻养,兩根觸角張開三個(gè)叉,臉正上方長(zhǎng)了一條尖尖的角诺舔,與脛部長(zhǎng)出...
    夢(mèng)想2050閱讀 409評(píng)論 2 12