閉包是什么棚品?用處如何?

閉包是什么赔硫?用處如何?

it修真院小課堂

目錄

1.背景介紹

2.知識剖析

3.常見問題

4.解決方案

5.編碼實(shí)戰(zhàn)

6.擴(kuò)展思考

7.參考文獻(xiàn)

8.更多討論

1.背景介紹

閉包(closure)是Javascript語言的一個(gè)難點(diǎn)倒谷,也是它的特色玫氢,很多高級應(yīng)用都要依靠閉包實(shí)現(xiàn)。閉包是「函數(shù)」和「函數(shù)內(nèi)部能訪問到的變量」(也叫環(huán)境)的總和讲仰。

2.知識剖析

閉包可以用在許多地方慕趴。它的最大用處有兩個(gè):

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

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

讀取函數(shù)內(nèi)部的變量的例子:

/*使用閉包讀取函數(shù)內(nèi)部的變量*/

function f1(){

n = 999;

function f2(){

alert(n);

}

return f2;

}

var result = f1();

result(); //999


在上面的代碼中,函數(shù)f2就被包括在函數(shù)f1內(nèi)部,這時(shí)f1內(nèi)部的所有局部變量冕房,對f2都是可見的躏啰。但是反過來就不行,f2內(nèi)部的局部變量耙册,對f1就是不可見的给僵。這就是Javascript語言特有的"鏈?zhǔn)阶饔糜?結(jié)構(gòu)(chain scope),子對象會一級一級地向上尋找所有父對象的變量详拙。所以帝际,父對象的所有變量,對子對象都是可見的饶辙,反之則不成立胡本。既然f2可以讀取f1中的局部變量,那么只要把f2作為返回值畸悬,我們不就可以在f1外部讀取它的內(nèi)部變量了嗎

變量的值始終保存在內(nèi)存的例子:

/*使用閉包讓函數(shù)內(nèi)部的變量儲存在內(nèi)存中*/

function f1(){

n = 999;

nAdd = function(){

n+=1;

};

function f2(){

alert(n);

}

return f2;

}

var result = f1();

result();//999

nAdd();

result();//1000


在這段代碼中侧甫,result實(shí)際上就是閉包f2函數(shù)。它一共運(yùn)行了兩次蹋宦,第一次的值是999披粟,第二次的值是1000。這證明了冷冗,函數(shù)f1中的局部變量n一直保存在內(nèi)存中守屉,并沒有在f1調(diào)用后被自動清除。因?yàn)閒1是f2的父函數(shù)蒿辙,而f2被賦給了一個(gè)全局變量拇泛,這導(dǎo)致f2始終在內(nèi)存中,而f2的存在依賴于f1思灌,因此f1也始終在內(nèi)存中俺叭,不會在調(diào)用結(jié)束后,被垃圾回收機(jī)制(garbage collection)回收泰偿。這段代碼中另一個(gè)值得注意的地方熄守,就是"nAdd=function(){n+=1}"這一行,首先在nAdd前面沒有使用var關(guān)鍵字耗跛,因此nAdd是一個(gè)全局變量裕照,而不是局部變量。其次调塌,nAdd的值是一個(gè)匿名函數(shù)(anonymous function)晋南,而這個(gè)匿名函數(shù)本身也是一個(gè)閉包,所以nAdd相當(dāng)于是一個(gè)setter羔砾,可以在函數(shù)外部對函數(shù)內(nèi)部的局部變量進(jìn)行操作负间。

3.常見問題

window.onload = function(){

var el = document.getElementById("id");

el.onclick = function(){

alert(el.id);

}

}


這段代碼為什么會造成內(nèi)存泄露紊扬?


4.解決方案

內(nèi)存泄漏的原因:執(zhí)行這段代碼的時(shí)候,將匿名函數(shù)對象賦值給el的onclick屬性唉擂;然后匿名函數(shù)內(nèi)部又引用了el對象,存在循環(huán)引用檀葛,所以不能被垃圾回收機(jī)制回收玩祟;


修改后:

window.onload = function(){

var el = document.getElementById("id");

? ? ? ? ? ? ? ? var id = el.id; //解除循環(huán)引用

? ? ? ? ? ? ? ? el.onclick = function(){

alert(id);

}

? ? ? ? ? ? ? ? el = null; // 將閉包引用的外部函數(shù)中活動對象清除

? ? ? ? ? ? ? ? }


5.編碼實(shí)戰(zhàn)

點(diǎn)擊按鈕會彈出相應(yīng)的數(shù)字0、1屿聋、2空扎、3、4

function init) {

var pAry = document.getElementsByTagName("button");

for( var i=0; i< pAry.length; i++ ) {

(function(arg){

pAry[i].onclick = function() {

alert(arg);

};

? ? ? ? ? ? ? ? })(i);//調(diào)用時(shí)參數(shù)

? ? ? ? ? ? ? ? }

}


思路:加一層閉包润讥,i以局部變量形式傳遞給內(nèi)存函數(shù)转锈,在js任務(wù)4中的殺人游戲選中的身份死亡有用到。


6.擴(kuò)展思考

在閉包中的this指向問題

7.參考文獻(xiàn)


8.更多討論

垃圾回收機(jī)制(garbage collection)以及匿名函數(shù)

感謝觀看



今天的分享就到這里啦楚殿,歡迎大家點(diǎn)贊撮慨、轉(zhuǎn)發(fā)、留言脆粥、拍磚~

技能樹.IT修真院???

? “我們相信人人都可以成為一個(gè)工程師砌溺,現(xiàn)在開始,找個(gè)師兄变隔,帶你入門规伐,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷孟辉担”猖闪。

? ?這里是技能樹.IT修真院,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線肌厨,學(xué)習(xí)透明化培慌,成長可見化,師兄1對1免費(fèi)指導(dǎo)柑爸。


? ?快來與我一起學(xué)習(xí)吧~http://www.jnshu.com/login/1/21109035

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末检柬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(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ī)與錄音,去河邊找鬼终畅。 笑死籍胯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的离福。 我是一名探鬼主播杖狼,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼妖爷!你這毒婦竟也來了蝶涩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤絮识,失蹤者是張志新(化名)和其女友劉穎绿聘,沒想到半個(gè)月后,有當(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
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彼念。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挪圾。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浅萧,死狀恐怖,靈堂內(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. 我叫王不留黔夭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓羽嫡,卻偏偏與公主長得像本姥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子杭棵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)婚惫,也就是一...
    悟名先生閱讀 4,149評論 0 13
  • ● 閉包基礎(chǔ) ● 閉包作用 ● 閉包經(jīng)典例子 ● 閉包應(yīng)用 ● 閉包缺點(diǎn) ● 參考資料 1、閉包基礎(chǔ) 作用域和作...
    lzyuan閱讀 937評論 0 0
  • 大家好魂爪,我是IT修真院成都分院第07期學(xué)員先舷,一枚正直善良的web程序員。 1.背景介紹 閉包(closure)是J...
    120De丶L閱讀 388評論 0 0
  • 學(xué)期末了滓侍,終于有時(shí)間悠閑地慢下來密浑。睡到自然醒,盡興聊聊天粗井,看個(gè)節(jié)目尔破,看本書街图,看個(gè)電影。 《馬戲之王》是一部視覺盛宴...
    風(fēng)來疏竹_88b3閱讀 388評論 0 2
  • 寒清墨影閱讀 166評論 0 0