1. 闭包的理解
首先, 我们可以理解闭包为:
闭包就是能够读取其他函数内部变量的函数
外层函数的作用域对象, 被内层函数对象引用着, 无法释放. 这个外层函数的作用域就是闭包对象
让这些变量的值始终保持在内存中,不会被垃圾回收机制回收
闭包的目的:
保护函数内部的变量, 防止被外部的变量污染到, 其内部函数只能通过外部函数访问到
2. 闭包例子
闭包怎么写呢, 方法如下:
- 外层函数包裹要保护的变量和内层函数, 内层函数一定要使用了外层函数的局部变量
- 外层函数将内层函数抛出到外部
- 调用者调用外层函数, 获得返回的内层函数对象, 保存在变量中, 反复使用.
function out() {
var total = 100;
return function(money){
total = total - money;
console.log(`小明花了${money}元, 还剩下${total}元`)
}
}
var pay = out()
pay(10);
pay(10);
total = 0;
pay(10)
// 小明花了10元, 还剩下90元
// 小明花了10元, 还剩下80元
// 小明花了10元, 还剩下70元
// 函数外边的变量并没有污染
3. 闭包的缺点
- 比普通函数占用更多的内存, 多占用外层函数的作用域对象
- 闭包不会自动释放, 可能造成内存泄漏
4. 闭包缺点解决方案
使用完闭包后, 如果不再使用了, 我们可以手动释放闭包
还是接着上面的代码
pay = null
5. 总结
5.1 作用
- 可以读取函数内部的变量
- 可以隐藏变量, 避免全局污染
5.2 缺点
- 可能造成内存泄漏
- 导致变量不会被垃圾回收机制回收, 造成内存消耗