閉包

在定義函數時就創建了一個作用域鏈並保存在函數的scope屬性中,當調用函數時,會爲函數創建一個執行環境,並通過複製scope屬性中的對象(變量對象)構建起執行環境的作用域鏈,並創建該函數的活動對象(可做變量對象)放入作用域鏈的前端,因此更內層的函數的作用域鏈會被重新定義,而閉包則是內層函數被更外部的變量對象引用,而內層函數又引用了定義它的環境的活動對象

function getCounter(){
    var n = 0;
    return function(){return ++n}  //匿名函數在getCounter開始執行時並不存在在內存中
}

var getNum = getCounter();

當程序讀到return 後的匿名函數時,就會創建一個函數對象,並在內存中生成一個地址,最後return給getNum的是一個地址;因爲該匿名函數的地址被全局變量保存,該函數也就被引用了,所以不再是匿名函數,最後該函數的作用域鏈,函數對象,和對getCounter函數的活動對象的引用都能被保存下來;

匿名函數的優點:節約內存空間 // 匿名函數被讀到了就創建2大對象(函數對象、作用域鏈對象)。
匿名函數只在調用時三大對象。函數對象和作用域鏈對象,讀完後因爲沒變量保存函數對象的地址,函數對象就被銷燬,因而作用域鏈也不能被保存下來;所以調用後三大對象都自動釋放。

發佈了33 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章