![240](https://cdn2.jianshu.io/assets/default_avatar/1-04bbeead395d74921af6a4e8214b4f61.jpg?imageMogr2/auto-orient/strip|imageView2/1/w/240/h/240)
簡單來說骇扇,假設函數(shù)A在函數(shù)B的內(nèi)部進行定義了欢伏,并且當函數(shù)A在執(zhí)行時抹沪,訪問了函數(shù)B內(nèi)部的變量對象肉渴,那么B就是一個閉包铜靶。
這個解釋不準確颊郎。簡而言之閉包就是運行時能訪問另外一個函數(shù)內(nèi)的變量的函數(shù)憋飞。例如:function A(){ var a="aa"; return function B(){alert(a)}}; funcA = A()。A和B都不算是閉包姆吭,A和B組合成構造了閉包環(huán)境榛做,真正的閉包是funcA。即A函數(shù)包變量a封閉起來了内狸,外面無法訪問检眯,但是提供了一個包B函數(shù)可以訪問。A和B一閉一包昆淡。上面那句話可以解釋為: 閉包就是運行時(funcA())能訪問另外一個函數(shù)(A)內(nèi)的變量(a)的函數(shù)(funcA)锰瘸。
人世間 評論自前端基礎進階(五):閉包
我覺得作用域鏈應該是當前執(zhí)行上下文的變量對象和上層環(huán)境的活動對象的集合,因為內(nèi)部函數(shù)被激活時昂灵,外部函數(shù)已經(jīng)開始執(zhí)行了避凝,此時外部函數(shù)得變量對象已經(jīng)是活動對象了!不知道是否可以這么理解U2埂管削?
思考了很久含思。我認為閉包是被動的,而真正的閉包是外部函數(shù)而不是內(nèi)部函數(shù)。
首先理解一個,當函數(shù)被聲明時其實已經(jīng)對函數(shù)中的變量進行了訪問含潘。如function fn1(){return a},此時外部函數(shù)foo中的a=10就被訪問了饲做,只是fn1()沒有執(zhí)行,所以不會return,但從chrome設置斷點看此時(fn2()被調用前)fn1中的a的值已經(jīng)是10了遏弱。
回歸正題艇炎,當任一內(nèi)部函數(shù)(如fn1,fn2,fn3....)對外部函數(shù)(如foo)的變量對象進行訪問時,外部函數(shù)“被動”成為閉包腾窝,成為閉包后所有內(nèi)部函數(shù)都擁有外部函數(shù)的變量對象的“顯式”索引缀踪,為什么說是顯式的,難道還有隱式的虹脯?是的驴娃,因為內(nèi)部函數(shù)本身就對外部函數(shù)的變量對象有訪問權(理解為隱式索引)。那么顯式索引是干嘛的循集?答案:是為了對抗垃圾回收機制唇敞。
這樣就可以解釋demo7中為什么fn1存在時形成閉包,不存在時不形成閉包了咒彤。因為fn1聲明時對外部變量對象進行了訪問疆柔。
綜上所述:閉包與不閉包決定了當垃圾回收機制來臨時會做何處理。
大家好,我是用時間釀酒醋火。 寫文不到2年悠汽,已出版1本書,第二本上個月剛剛簽約完稿芥驳。 全文近8000多字柿冲,滿滿的干貨,同時為了降低大家的閱讀壓力兆旬,所有重點內(nèi)容已加粗處理假抄。 大家可...