閉包概念以及特性

1、概念:閉包是詞法閉包的的簡稱,是引用了自由變量的函數(shù)水醋。這個被引用的自由變量和這個函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造他的環(huán)境也不例外彪置。另一種說法拄踪,閉包是由函數(shù)和其相關(guān)的環(huán)境組成的實(shí)體

(1)在js中一個函數(shù)在另一個函數(shù)中定義,可以訪問到父函數(shù)的成員悉稠,內(nèi)部的函數(shù)就稱為閉包函數(shù)

(2)
解釋:閉包是詞法閉包的的簡稱宫蛆,是引用了自由變量的函數(shù)

function f1(){
     var a=10;
     var b=20;
     function f2(){
          console.log(a);
     };
     f2();
}
f1();

結(jié)果是:
查看閉包是

var a=10; 
var b=20;
function f2(){}

引用的函數(shù)指的是f2() ,引用的自由變量是父函數(shù)的自由變量 a b

解釋:即使已經(jīng)離開了創(chuàng)造他的環(huán)境也不例外的猛。

function f1(){
     var a=10;
     var b=20;
     return function f2(){
          console.log(a);
     };   
}
var result=f1();
restult()

結(jié)果是:

var a=10;
var b=20;

f2()離開了f1的作用域仍然能夠?qū)崿F(xiàn)訪問ab耀盗,就是f2的scope作用域在f1的詞法環(huán)境外面,仍然能夠訪問f1內(nèi)部的詞法環(huán)境

2卦尊、閉包特點(diǎn)
(1)閉包作為與函數(shù)成對的數(shù)據(jù)叛拷,在函數(shù)執(zhí)行過程中屬于激活狀態(tài)脏嚷,
(2)閉包運(yùn)行結(jié)束后株依,保持運(yùn)行過程中的最終數(shù)據(jù)狀態(tài)
函數(shù)閉包的目的:閉包的函數(shù)如何訪問數(shù)據(jù)(作用域可見性)房待,以及閉包內(nèi)的數(shù)據(jù)如何銷毀(數(shù)據(jù)引用識別)
3踪古、兩種表示
(1)閉包是一個對象九串,對象里有一個函數(shù)亭畜,以及被這個函數(shù)封閉捕獲的變量循集。
(2)閉包是一種函數(shù)掸哑,與這個函數(shù)相關(guān)聯(lián)的還有捕獲變量的環(huán)境

4扫尺、閉包的好處
(1)減少全局變量

function add(){
     var a=0;
     a++;
     return a;
}

調(diào)用一次:add();//返回結(jié)果是1
在調(diào)用一次:add();//返回結(jié)果依然是1
因?yàn)閍在函數(shù)中是局部變量筋栋,每次都被初始化,如果要實(shí)現(xiàn)1,2,3的效果需要把a(bǔ)放到外面進(jìn)行全局變量

閉包可以實(shí)現(xiàn)避免全局變量

function add(){
     var a=0;
     return function(){  //不管有沒有return都能實(shí)現(xiàn)閉包正驻,匿名函數(shù)

          a++;
          alert(a);
     }     
};
var result=add();//add()函數(shù)返回一個匿名函數(shù)弊攘,這個函數(shù)保留了a的詞法環(huán)境抢腐,即一個閉包,所以在調(diào)用的時候a的值從0開始
result();//返回1
result();//返回2

(2)減少參數(shù)傳遞數(shù)量

function calFactory(base){
     //這里面也是一個閉包襟交,下面的匿名函數(shù)詞法環(huán)境包括base迈倍,引用內(nèi)部成員變量和內(nèi)部成員函數(shù),形成一個閉包

     return function(max){
          var total=0;
          for(var i=0;i<=max;i+=){
               total+=i;
           }
          return total+base;
     }
}

調(diào)用

var adder=calFactory(2);  //calFactory每調(diào)用一次都會產(chǎn)生一個新的閉包
alert(adder(3))//返回結(jié)果為8
alert(adder(2))//返回結(jié)果為5

(3)封裝的作用

(functon (){
     var m=0;
     function getM(){  //
          return m
     };
     function setM(value){
          m=value
     };
     window.g=getM;  //返回到window上
     window.s=setM;  //返回到window上

})();
s(12);
alert(g());//12

5捣域、閉包的注意點(diǎn)
(1)如果閉包捕獲父環(huán)境中的變量啼染,只是引用,不是復(fù)制
(2)父函數(shù)每次調(diào)用會產(chǎn)生不同的閉包
(3)循環(huán)的時候會出現(xiàn)的問題

     <body>
          <div id="1">1</div>
          <div id="2">2</div>
          <div id="3">3</div>
     </body>

for(var i=1;i++;i<=3){
     var ele=document.getElementById(i);
     ele.onclick=function(){
          alert(i) ;
     }
}

//彈出的都是
//此時產(chǎn)生的問題是竟宋,由于javascript沒有塊級作用域提完,所以,var i把i做成了一個全局變量丘侠,當(dāng)產(chǎn)生ele的時候徒欣,循環(huán)時,都產(chǎn)生了三個元素蜗字,但是此時onclick還沒有執(zhí)行打肝,并且由于i是全局對象,當(dāng)引用的時候挪捕,i已經(jīng)變成了4

閉包實(shí)現(xiàn)方式

for(var i=1;i++;i<=3){
     var ele=document.getElmentById(i);
     ele.onclick=(function(id){
          return function(){
               alert (id)
          }
     })(i
);//把i傳進(jìn)去
}
//因?yàn)槭橇⒓磮?zhí)行函數(shù)粗梭,當(dāng)生成了一個ele就立即調(diào)用一次,就把i傳進(jìn)去一次级零,當(dāng)ele發(fā)生變化時断医,在立即調(diào)用函數(shù),并且閉包的調(diào)用每次會產(chǎn)生不同的閉包奏纪,i的值傳遞的都是新進(jìn)入的
//主要是立即調(diào)用函數(shù)鉴嗤,不用等待就能執(zhí)行,就能產(chǎn)生閉包
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末序调,一起剝皮案震驚了整個濱河市醉锅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌发绢,老刑警劉巖硬耍,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異边酒,居然都是意外死亡经柴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門墩朦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來口锭,“玉大人,你說我怎么就攤上這事介杆【椴伲” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵春哨,是天一觀的道長荆隘。 經(jīng)常有香客問我,道長赴背,這世上最難降的妖魔是什么椰拒? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮凰荚,結(jié)果婚禮上燃观,老公的妹妹穿的比我還像新娘。我一直安慰自己便瑟,他們只是感情好缆毁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著到涂,像睡著了一般脊框。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上践啄,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天浇雹,我揣著相機(jī)與錄音,去河邊找鬼屿讽。 笑死昭灵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伐谈。 我是一名探鬼主播烂完,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衩婚!你這毒婦竟也來了窜护?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤非春,失蹤者是張志新(化名)和其女友劉穎柱徙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奇昙,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡护侮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了储耐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羊初。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出长赞,到底是詐尸還是另有隱情晦攒,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布得哆,位于F島的核電站脯颜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贩据。R本人自食惡果不足惜栋操,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饱亮。 院中可真熱鬧矾芙,春花似錦、人聲如沸近上。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戈锻。三九已至歼跟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間格遭,已是汗流浹背哈街。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拒迅,地道東北人骚秦。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像璧微,于是被迫代替她去往敵國和親作箍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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

  • 閉包(closure)是Javascript語言的一個難點(diǎn)前硫,也是它的特色胞得,很多高級應(yīng)用都要依靠閉包實(shí)現(xiàn)。 一屹电、變量...
    zock閱讀 1,075評論 2 6
  • 閉包(closure)是Javascript語言的一個難點(diǎn)阶剑,也是它的特色,很多高級應(yīng)用都要依靠閉包實(shí)現(xiàn)危号。 一牧愁、變量...
    zouCode閱讀 1,271評論 0 13
  • 什么是閉包 了解什么是閉包之前,要先了解變量的作用域外莲,變量的作用域無非就是兩種:全局變量和局部變量猪半。Javascr...
    洗陽光閱讀 556評論 0 4
  • ● 閉包基礎(chǔ) ● 閉包作用 ● 閉包經(jīng)典例子 ● 閉包應(yīng)用 ● 閉包缺點(diǎn) ● 參考資料 1、閉包基礎(chǔ) 作用域和作...
    lzyuan閱讀 937評論 0 0
  • Proxy(概念): 代理服務(wù)器。請求不直接發(fā)給網(wǎng)絡(luò)磨确,而是先發(fā)給proxy沽甥,再由proxy發(fā)給網(wǎng)絡(luò)。 Nginx...
    LittleArch閱讀 258評論 0 0