javascript之函數作用域和閉包[function scope and closure]

 
what is the closure?
在計算機領域當中, a closure is a function that is evaluated in an environment containing one or more bound variables. 當該函數被調用時, 它可以訪問該環境中的變量,直接使用closure的例子如,函數式語言如ML和LISP。
在其它一些語言中構造對象也通常使用closure。
在一些語言當中, 一個closure在一個函數中定義另外函數時出現,同時inner function引用了outer的local variable。在運行的時候, 當outer function執行時, 一個closure就會形成, 它包含inner function的代碼以及對該closure需要的、outer function的變量的引用。
closure可以被用來爲function關聯一組私有變量,這些變量會在一組函數調用後一直有效,也就是變量的狀態會保持。而這些變量的作用域僅爲定義這些變量的函數的範圍,所以它們不會被其它外部的程序訪問。定義的一個變量的值會在多次訪問的過程中一直存儲。作爲結果,可以使用closure來實現狀態隱藏,因此可以實現面向對象編程的封裝。

 

 

javascript中的函數作用域和閉包:

 

例子一

var x = "global";

function f() {

     var x = "local";

     function g() {

         alert(x);

    }

     g();

}

 f();
如例子一,當f();執行前時,當前的scope chain可以想象爲 global obj,而var x = “global”爲global的屬性,當f被調用是,一個新的call object被創建,不妨稱其爲callee_f, 所以當前的scope chain 爲global obj<--callee_f,而var x=“local”成爲callee_f的屬性。在f函數的執行過程當中, g被調用,則此時g的call object被創建, 稱之爲callee_g, 此時的scope chain爲globa obj<--callee_f<--callee_g,  所以在g執行的時候, alert(x)中的x爲called_f的x, global的x被屏蔽掉了, 顯示爲local。 當g執行完成以後,唯一指向g的引用爲callee_g會被從scope chain中移除,所以在沒有指向g的已用,故g將會在合適的時機被垃圾回收。其它雷同。
 
例子二
uniqueID = (function() {
    var id = 0;
    return function(){return id++;};
})();
 
global<--callee_outer<--callee_inner, 同時global-->callee_inner有一個global或其它obj對callee_inner的reference。儘管callee_outer在outer function調用結束是不再對callee_inner進行引用, 而callee_inner仍然保存了對callee_outer的引用,所以此時可以看做global-->callee_inner-->callee_outer, outer function的屬性和狀態被保存了下來, 但外部訪問不了這些屬性或者狀態, 僅能通過inner function的引用通過定義好的函數接口來訪問該outer function 的內部狀態。
發佈了31 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章