作用域
在程序的某個(gè)節(jié)點(diǎn)上的作用域指的是掂恕,該代碼節(jié)點(diǎn)能夠閱讀到的所有實(shí)體(entity)拖陆,也被稱(chēng)為上下文或者執(zhí)行環(huán)境。
(注:entity簡(jiǎn)單來(lái)講就是由標(biāo)識(shí)符代表的代碼和變量)
詞法作用域與動(dòng)態(tài)作用域
以上我們提到作用域的討論依賴具體的程序節(jié)點(diǎn)懊亡,這個(gè)程序節(jié)點(diǎn)可以細(xì)分為如下兩塊依啰。
- lexical scope(詞法作用域):源代碼的文本片段(area of text)
- dynamic scope(動(dòng)態(tài)作用域):源代碼的節(jié)點(diǎn)運(yùn)行時(shí)(runtime)
詞法作用域(靜態(tài)作用域)是在書(shū)寫(xiě)代碼或者說(shuō)定義時(shí)確定的,而動(dòng)態(tài)作用域是在運(yùn)行時(shí)確定的店枣。
詞法作用域關(guān)注函數(shù)在何處聲明速警,而動(dòng)態(tài)作用域關(guān)注函數(shù)從何處調(diào)用,其作用域鏈?zhǔn)腔谶\(yùn)行時(shí)的調(diào)用棧的鸯两。
詞法作用域執(zhí)行方式
詞法作用域的函數(shù)中遇到既不是形參也不是函數(shù)內(nèi)部定義的局部變量的變量時(shí)闷旧,去函數(shù)定義時(shí)的環(huán)境中查詢。
動(dòng)態(tài)域的函數(shù)中遇到既不是形參也不是函數(shù)內(nèi)部定義的局部變量的變量時(shí)钧唐,到函數(shù)調(diào)用時(shí)的環(huán)境中查忙灼。
閉包在語(yǔ)言中的實(shí)現(xiàn)方式
要實(shí)現(xiàn)閉包,在數(shù)據(jù)結(jié)構(gòu)選型方面,肯定不是線性stack该园,因?yàn)殚]包在執(zhí)行時(shí)酸舍,仍應(yīng)該保持綁定上下文的不變,而不是去閱讀對(duì)應(yīng)的執(zhí)行環(huán)境里初。而線性(stack)顯然無(wú)法滿足要求啃勉。
實(shí)際上對(duì)于大部分擁有閉包的語(yǔ)言,程序語(yǔ)言采用的是堆(heap)的形式存儲(chǔ)上下文non-local變量双妨。 也正因?yàn)槿绱嘶床@些語(yǔ)言基本自帶GC(垃圾回收)。
閉包的形成需要兩個(gè)條件
在函數(shù)內(nèi)部創(chuàng)建新的函數(shù)
新的函數(shù)在執(zhí)行時(shí)斥难,訪問(wèn)了函數(shù)的變量對(duì)象
結(jié)論
- 閉包是詞法作用域在函數(shù)式編程語(yǔ)言的集中體現(xiàn)枝嘶。(閉包的形成,與作用域鏈的訪問(wèn)順序有直接關(guān)系哑诊。)
- 在實(shí)踐上群扶,閉包就是函數(shù)和上下文的綁定。(只有內(nèi)部函數(shù)訪問(wèn)了上層作用域鏈中的變量對(duì)象時(shí)镀裤,才會(huì)形成閉包)
- 閉包允許閉包內(nèi)的函數(shù)竞阐,訪問(wèn)閉包創(chuàng)建時(shí)拷貝的上下文變量(值或者引用)。