當調用函數的時候,都會爲之建立一個新的對象來保存局部變量,把這個對象添加至做用域鏈中。當函數返回的時候,就從做用域鏈中將這個綁定變量的對象刪除。函數
若是不存在嵌套的函數,也沒有其餘引用指向這個綁定的對象,它就會被回收掉。spa
若是定義了嵌套的函數,每一個嵌套的函數都對應着一個做用域鏈,而且這個做用域鏈指向一個變量綁定對象。對象
但若是這些嵌套的函數對象在外部函數中保存下來,那麼它們也會和所指向的變量綁定對象同樣當作垃圾回收。作用域
可是,若是這個函數定義了嵌套的函數,並將它做爲返回值返回或者存儲在某處的屬性裏,這時就會有一個外部引用指向這個嵌套的函數。它就不會被當作垃圾回收,io
而且它所綁定的對象也不會被當作垃圾回收。console
var Book = (function(){
var bookNum = 0;//不可變
var s = function(){
console.log(bookNum++);
}
return s;
})();function
這個函數中BOOK至關於S,函數自執行,至關於只執行了一次。外部引用指的對象惟一。變量
var b = Book;
var c = Book;
console.log(b===c);//true;
垃圾回收
function Book (){
var bookNum = 0;//不可變
var s = function(){
console.log(bookNum++);
}
return s;
}
var b = Book();
var c = Book();
console.log(b===c);引用
這個函數b,c分別執行了一次BOOK();至關於有兩個外部引用對象指向這個函數。