本文基於《JavaScript高級程序設計》整理。
上篇解釋了閉包爲什麼會佔用過多的內存。這一篇來講如何使用閉包可以減少閉包對內存的佔用。
閉包的作用域鏈中包含了外部的包含函數的活動對象。
通過解除對匿名函數的引用,可以將匿名函數佔用的內存安全釋放。
function outerFun(outerArg){
return function(){
console.log('這裏是內部匿名函數')
console.log('可以訪問包含函數的變量',outerArg)
}
}
var create = outerFun("hi") //創建一個函數,是outerFun中返回的匿名函數
create() // 調用函數,是調用匿名函數
create = null // 釋放對匿名函數的引用
那麼,如果沒有對匿名函數的引用,匿名函數執行完之後自動銷燬,就可以做到減少佔用內存的問題。
利用匿名函數,製造私有作用域(塊級作用域),這樣匿名函數執行完之後可以將引用的活動對象銷燬。
// 匿名函數 模仿 塊級作用域
(function(){
// 此處爲塊級作用域
// 這裏面的變量都會在函數執行完之後釋放內存
})()
比如:
function outputNumbers(count){
// 不用return function,不能引用內部的匿名函數
// 匿名函數立即執行
(function(){
for(var i = 0; i < count; i++){
console.log(i)
}
})()
console.log(i) // 出錯,因爲函數執行完後i變量已銷燬
}