javascript閉包詳解

 下面先看一個例子,在不運行的情況下推測一下返回結果.

function t1(){
    var age = 20;
    function t2(){
        alert(age);
    }
    return t2;
}
var temp = t1();
var age = 99;
temp();

在學習了作用域之後也許會分析結果是99,實際上是20.

下面對其一一分析:

在大部分語言中,t1被調用執行,則申請內存並把其局部變量push入棧。t1函數執行完畢,內部的局部變量隨着函數退出而銷燬。因此age=20的局部變量已經消失了。但是在js中,age=20這個變量,卻被t2捕捉,即使t1執行完畢,通過t2依然能訪問該變量。在js中,t1執行過程中,又生成t2,而從作用域上來說,t2能訪問到age=20,於是age=20沒有消失,而是與返回的t2函數形成了一個“環境包”,這個包屬於t2,所以叫閉包。這種情況下,返回的函數並非孤立的函數,甚至把周圍的變量環境,形成了一封閉的“環境包”共同返回,所以叫閉包。

一句話概括,函數的作用域取決於聲明時,而不取決與調用時。

例如如果在多人開發的程序中需要一個計數器,我們就可以用閉包實現。

var cnt =( function(){
    var count = 0;
    return function(){
        return ++count;
    }
}());
alert(cnt());
alert(cnt());
alert(cnt());


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章