閉包的那些事--啥是閉包有鹿?

本文將力求最全面旭旭,最普遍的總結(jié)對(duì)閉包的理解

要想了解閉包,首先看一下變量作用域葱跋。


一持寄、變量的作用域。

變量的作用域有兩種:全局變量局部變量娱俺。

Javascript語言的特殊之處在于:

函數(shù)內(nèi)部可以直接讀取全局變量稍味。在函數(shù)外部自然無法讀取函數(shù)內(nèi)的局部變量。

這里有一個(gè)地方需要注意荠卷,函數(shù)內(nèi)部聲明變量的時(shí)候模庐,一定要使用var命令。如果不用的話油宜,你實(shí)際上聲明了一個(gè)全局變量掂碱!


那么如何從外部讀取局部變量?

正常情況下慎冤,這是辦不到的疼燥,只有通過變通方法才能實(shí)現(xiàn)。那就是在函數(shù)的內(nèi)部蚁堤,再定義一個(gè)函數(shù)醉者。

這就是Javascript語言特有的“鏈?zhǔn)阶饔糜颉?/em>結(jié)構(gòu):子對(duì)象會(huì)一級(jí)一級(jí)地向上尋找所有父對(duì)象的變量。所以披诗,父對(duì)象的所有變量,對(duì)子對(duì)象都是可見的搞莺,反之則不成立

function fn1(){
    n=999;
    function fn2(){
      alert(n);
    }
    return fn2;
  }
  var result=fn1();
  result(); // 999

二温圆、閉包的概念

閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)岁歉。
由于在Javascript語言中膝蜈,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量熔掺,因此可以把閉包簡(jiǎn)單理解成“定義在一個(gè)函數(shù)內(nèi)部的函數(shù)”非剃。
所以备绽,在本質(zhì)上恨锚,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁猴伶。

或者換句話說蜗顽,子函數(shù)可以使用父函數(shù)的局部變量

function show() {
    var a=12;
    function show1(){
    alert(a);
        }
      show1();
}
show();//12

閉包更普遍的一種理解方式:

其實(shí)布卡,很多函數(shù)都存在閉包忿等,廣義的講,所有函數(shù)都可以是閉包;
以下兩種方式都可以形成閉包

(function(){
    封閉空間
})()
{
    let      //es6的定義變量的一種用法
}

閉包另一種更嚴(yán)格的理解方式---詞法環(huán)境

閉包由函數(shù)和與其相關(guān)的引用環(huán)境的組合而成
閉包允許函數(shù)訪問其引用環(huán)境中的變量(又稱自由變量)
廣義上來說娇跟,所有 JavaScript 的函數(shù)都可以成為閉包苞俘,因?yàn)?JavaScript 函數(shù)在創(chuàng)建時(shí)保存了當(dāng)前的詞法環(huán)境。

function add() {
        var i = 0;
        return function() {
                alert(i++);
        }
}
var f = add();
f();
f();

三歌亲、閉包延伸

1陷揪、

Js代碼:

function outerFun(){
         var a=0;
         function innerFun() {
                a++;
                alert(a);
         }
       return innerFun;  //注意這里
}
var obj=outerFun();
obj();  //結(jié)果為1
obj();  //結(jié)果為2  注意這里說明變量在內(nèi)存不會(huì)被 釋放,因?yàn)殚]包需要它們
var obj2=outerFun();
obj2();  //結(jié)果為1
obj2();  //結(jié)果為2  注意這里說明變量在內(nèi)存不會(huì)被釋放,因?yàn)殚]包需要它們

什么是閉包:
當(dāng)內(nèi)部函數(shù) 在定義它的作用域 的外部被引用時(shí),就創(chuàng)建了該內(nèi)部函數(shù)的閉包 ,
如果內(nèi)部函數(shù)引用了位于外部函數(shù)的變量,當(dāng)外部函數(shù)調(diào)用完畢后,這些變量在內(nèi)存不會(huì)被 釋放,因?yàn)殚]包需要它們.

2滤港、

Js代碼:

 var a=13;
 function show(){
       var a=5;
       alert(a);
  }
  show();    //結(jié)果 5
  alert(a);   //結(jié)果 13

遮蔽
當(dāng)函數(shù)內(nèi)部和外部同時(shí)定義一個(gè)變量時(shí),這是兩者雖然名字相同脑又,但作用域不同暮胧,沒有毛線關(guān)系,既不會(huì)發(fā)生閉包也不會(huì)產(chǎn)生聯(lián)系问麸,這是遮蔽

3往衷、

Js代碼

function outerFun(){
     var a =0;
     alert(a);  
}
var a=4;
outerFun();
alert(a);

結(jié)果是 0,4 .
因?yàn)樵诤瘮?shù)內(nèi)部使用了var關(guān)鍵字 維護(hù)a的作用域在outFun()內(nèi)部.

再看下面的代碼:

function outerFun(){
         //沒有var 
         a =0;
         alert(a);  
}
var a=4;
outerFun();
alert(a);

結(jié)果為 0,0 真是奇怪,為什么呢?
作用域鏈是描述一種路徑的術(shù)語,沿著該路徑可以確定變量的值 .
當(dāng)執(zhí)行a=0時(shí),因?yàn)闆]有使用var關(guān)鍵字,因此賦值操作會(huì)沿著作用域鏈到var a=4; 并改變其值


本文為小編參考其他作者觀點(diǎn)結(jié)合自己體會(huì)而進(jìn)行的再創(chuàng)作和總結(jié),主要是為了梳理閉包知識(shí)點(diǎn)严卖,方便讀者閱讀席舍;
參考鏈接:http://www.jb51.net/article/24101.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哮笆,隨后出現(xiàn)的幾起案子来颤,更是在濱河造成了極大的恐慌,老刑警劉巖疟呐,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脚曾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡启具,警方通過查閱死者的電腦和手機(jī)本讥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拷沸,你說我怎么就攤上這事色查。” “怎么了撞芍?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵秧了,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我序无,道長(zhǎng)验毡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任帝嗡,我火速辦了婚禮晶通,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哟玷。我一直安慰自己狮辽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布巢寡。 她就那樣靜靜地躺著喉脖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抑月。 梳的紋絲不亂的頭發(fā)上树叽,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音爪幻,去河邊找鬼菱皆。 笑死须误,一個(gè)胖子當(dāng)著我的面吹牛挨稿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播京痢,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼奶甘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了祭椰?” 一聲冷哼從身側(cè)響起臭家,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎方淤,沒想到半個(gè)月后钉赁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡携茂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年你踩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡带膜,死狀恐怖吩谦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膝藕,我是刑警寧澤式廷,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站芭挽,受9級(jí)特大地震影響滑废,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袜爪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一策严、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饿敲,春花似錦妻导、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓢对,卻和暖如春寿酌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硕蛹。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工醇疼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人法焰。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓秧荆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親埃仪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乙濒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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