![240](https://cdn2.jianshu.io/assets/default_avatar/1-04bbeead395d74921af6a4e8214b4f61.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240)
簡(jiǎn)單來說亏拉,假設(shè)函數(shù)A在函數(shù)B的內(nèi)部進(jìn)行定義了仔沿,并且當(dāng)函數(shù)A在執(zhí)行時(shí)坐桩,訪問了函數(shù)B內(nèi)部的變量對(duì)象,那么B就是一個(gè)閉包封锉。
這個(gè)解釋不準(zhǔn)確绵跷。簡(jiǎn)而言之閉包就是運(yùn)行時(shí)能訪問另外一個(gè)函數(shù)內(nèi)的變量的函數(shù)。例如:function A(){ var a="aa"; return function B(){alert(a)}}; funcA = A()成福。A和B都不算是閉包碾局,A和B組合成構(gòu)造了閉包環(huán)境,真正的閉包是funcA奴艾。即A函數(shù)包變量a封閉起來了净当,外面無法訪問,但是提供了一個(gè)包B函數(shù)可以訪問蕴潦。A和B一閉一包像啼。上面那句話可以解釋為: 閉包就是運(yùn)行時(shí)(funcA())能訪問另外一個(gè)函數(shù)(A)內(nèi)的變量(a)的函數(shù)(funcA)。
人世間 評(píng)論自前端基礎(chǔ)進(jìn)階(五):閉包
我覺得作用域鏈應(yīng)該是當(dāng)前執(zhí)行上下文的變量對(duì)象和上層環(huán)境的活動(dòng)對(duì)象的集合潭苞,因?yàn)閮?nèi)部函數(shù)被激活時(shí)忽冻,外部函數(shù)已經(jīng)開始執(zhí)行了,此時(shí)外部函數(shù)得變量對(duì)象已經(jīng)是活動(dòng)對(duì)象了此疹!不知道是否可以這么理解I稀?
埃的騷幾里 評(píng)論自前端基礎(chǔ)進(jìn)階(五):閉包
思考了很久。我認(rèn)為閉包是被動(dòng)的,而真正的閉包是外部函數(shù)而不是內(nèi)部函數(shù)衍菱。
首先理解一個(gè),當(dāng)函數(shù)被聲明時(shí)其實(shí)已經(jīng)對(duì)函數(shù)中的變量進(jìn)行了訪問肩豁。如function fn1(){return a},此時(shí)外部函數(shù)foo中的a=10就被訪問了脊串,只是fn1()沒有執(zhí)行,所以不會(huì)return,但從chrome設(shè)置斷點(diǎn)看此時(shí)(fn2()被調(diào)用前)fn1中的a的值已經(jīng)是10了清钥。
回歸正題琼锋,當(dāng)任一內(nèi)部函數(shù)(如fn1,fn2,fn3....)對(duì)外部函數(shù)(如foo)的變量對(duì)象進(jìn)行訪問時(shí),外部函數(shù)“被動(dòng)”成為閉包祟昭,成為閉包后所有內(nèi)部函數(shù)都擁有外部函數(shù)的變量對(duì)象的“顯式”索引缕坎,為什么說是顯式的,難道還有隱式的篡悟?是的谜叹,因?yàn)閮?nèi)部函數(shù)本身就對(duì)外部函數(shù)的變量對(duì)象有訪問權(quán)(理解為隱式索引)匾寝。那么顯式索引是干嘛的?答案:是為了對(duì)抗垃圾回收機(jī)制荷腊。
這樣就可以解釋demo7中為什么fn1存在時(shí)形成閉包艳悔,不存在時(shí)不形成閉包了。因?yàn)閒n1聲明時(shí)對(duì)外部變量對(duì)象進(jìn)行了訪問女仰。
綜上所述:閉包與不閉包決定了當(dāng)垃圾回收機(jī)制來臨時(shí)會(huì)做何處理猜年。
大家好蘑辑,我是用時(shí)間釀酒。 寫文不到2年坠宴,已出版1本書洋魂,第二本上個(gè)月剛剛簽約完稿。 全文近8000多字喜鼓,滿滿的干貨副砍,同時(shí)為了降低大家的閱讀壓力,所有重點(diǎn)內(nèi)容已加粗處理庄岖。 大家可...