本文基于《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变量已销毁
}