![240](https://cdn2.jianshu.io/assets/default_avatar/1-04bbeead395d74921af6a4e8214b4f61.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240)
簡單來說,假設(shè)函數(shù)A在函數(shù)B的內(nèi)部進(jìn)行定義了悬垃,并且當(dāng)函數(shù)A在執(zhí)行時昵观,訪問了函數(shù)B內(nèi)部的變量對象鹃两,那么B就是一個閉包意推。
這個解釋不準(zhǔn)確宗挥。簡而言之閉包就是運(yùn)行時能訪問另外一個函數(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封閉起來了搪桂,外面無法訪問,但是提供了一個包B函數(shù)可以訪問盯滚。A和B一閉一包踢械。上面那句話可以解釋為: 閉包就是運(yùn)行時(funcA())能訪問另外一個函數(shù)(A)內(nèi)的變量(a)的函數(shù)(funcA)。
我覺得作用域鏈應(yīng)該是當(dāng)前執(zhí)行上下文的變量對象和上層環(huán)境的活動對象的集合魄藕,因?yàn)閮?nèi)部函數(shù)被激活時内列,外部函數(shù)已經(jīng)開始執(zhí)行了,此時外部函數(shù)得變量對象已經(jīng)是活動對象了背率!不知道是否可以這么理解;扒啤?
思考了很久。我認(rèn)為閉包是被動的,而真正的閉包是外部函數(shù)而不是內(nèi)部函數(shù)饵筑。
首先理解一個埃篓,當(dāng)函數(shù)被聲明時其實(shí)已經(jīng)對函數(shù)中的變量進(jìn)行了訪問。如function fn1(){return a},此時外部函數(shù)foo中的a=10就被訪問了根资,只是fn1()沒有執(zhí)行架专,所以不會return,但從chrome設(shè)置斷點(diǎn)看此時(fn2()被調(diào)用前)fn1中的a的值已經(jīng)是10了。
回歸正題玄帕,當(dāng)任一內(nèi)部函數(shù)(如fn1,fn2,fn3....)對外部函數(shù)(如foo)的變量對象進(jìn)行訪問時部脚,外部函數(shù)“被動”成為閉包,成為閉包后所有內(nèi)部函數(shù)都擁有外部函數(shù)的變量對象的“顯式”索引桨仿,為什么說是顯式的睛低,難道還有隱式的?是的服傍,因?yàn)閮?nèi)部函數(shù)本身就對外部函數(shù)的變量對象有訪問權(quán)(理解為隱式索引)。那么顯式索引是干嘛的骂铁?答案:是為了對抗垃圾回收機(jī)制吹零。
這樣就可以解釋demo7中為什么fn1存在時形成閉包,不存在時不形成閉包了拉庵。因?yàn)閒n1聲明時對外部變量對象進(jìn)行了訪問灿椅。
綜上所述:閉包與不閉包決定了當(dāng)垃圾回收機(jī)制來臨時會做何處理。
大家好衰伯,我是用時間釀酒。 寫文不到2年积蔚,已出版1本書意鲸,第二本上個月剛剛簽約完稿。 全文近8000多字尽爆,滿滿的干貨怎顾,同時為了降低大家的閱讀壓力,所有重點(diǎn)內(nèi)容已加粗處理漱贱。 大家可...