Contents
一種定義是:
A "closure" is an expression (typically a function) that can have free variables together with an environment that binds those variables (that "closes" the expression).
我的理解是: closure 是一個表達(dá)式(通常是一個函數(shù)), 這個表達(dá)式與一個 環(huán)境 共享著一些自由變量, 而這個 環(huán)境 則 綁定 著那些自由變量(或者說 結(jié)束 這個表達(dá)式, 這也是所謂closure 的名字由來). 所謂的 環(huán)境 就是一個更大的block, 所有的自由變量在這個 block 中 聲明(有意義). 而 綁定 也就是指這些自由變量的作用域就是這個環(huán)境.
舉個簡單的例子.
var flag = false; //調(diào)試開關(guān) // env 既是所謂的環(huán)境 // 而inner就是所謂的表達(dá)式, name即是所謂的自由變量 function env() //整個env可以看作是一個closure { var name = "zhutao"; function inner() { return name + " is a student."; } return inner; //返回的是一個內(nèi)部函數(shù) }//closure結(jié)束 flag = true; if (flag) { // 此處是最神奇的地方, 代碼執(zhí)行在此處, inner函數(shù)其實已經(jīng)出了env的body, // 而仍然能夠被引用, 這就是所謂形成了一個 closure var inner_func_ref = env(); // 這時候inner_func_ref引用的就是inner()函數(shù)對象 alert(inner_func_ref()); // zhutao is a student. } 而在上面的例子中, 函數(shù)env就是所謂的定義中的 環(huán)境, 函數(shù)inner就是定義中所謂的 表達(dá)式, 而name即是所謂的 自由變量, 綁定 在env這個 環(huán)境 中. env的結(jié)束也即closure的結(jié)束.
而在javascript中,如果內(nèi)部函數(shù)出了自己的所在的外部函數(shù)的body仍然能夠引用,則會形成所謂的closure.
在具體了解closure之前,我們需要了解一些其它的知識.
在 javascript 中,每行可執(zhí)行的代碼都具有一定的 執(zhí)行空間, 如全局的執(zhí)行空間, 函數(shù)的執(zhí)行空間, 遞歸后的函數(shù)執(zhí)行空間等. 而一個完整的 javascript 執(zhí)行過程,可以看作是有一個執(zhí)行空間棧 ,不斷地 進(jìn)行 執(zhí)行空間 的變化(出棧,進(jìn)棧).
這個是很重要的概念,這個概念的理解與本系列的將要完成的另一篇文章 this關(guān)鍵字 的理解也是密切相關(guān)的.
詳細(xì)解釋請參考即將完成的 this關(guān)鍵字 的博文.
執(zhí)行空間可以理解為具有屬性的對象集, 但是通常這些屬性都不是可隨意訪問的, 而這些對象集為代碼的執(zhí)行 提供了一定的上下文(空間).
新聞熱點
疑難解答
圖片精選