一、闭包的作用
- 实现公有变量 — 函数累加器
- 可以做缓存(存储结构)
- 可以实现封装,属性私有化
- 模块化开发,防止污染全局变量
闭包实现 1 + … + 100
function add() {var count = 0;function demo() {count++;console.log(count);}return demo;
}var counter = add();
counter();for (let i = 0; i < 100; i++) {counter();
}
闭包对变量影响
function test() {let num = 100;function a() {num++;console.log(num);}function b() {num--;console.log(num);}return [a, b];
}var myArr = test();myArr[0](); // 101
myArr[1](); // 100
二、闭包的弊端
当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏(内存被占用的多了,剩的内存就少了。反着理解)
用立即执行函数,解决闭包变量不释放
function test() {let arr = [];for (let i = 0; i < 10; i++) {// 闭包触发// for (let i = 0; i < 10; i++) {// arr[i] = function() {// document.write(i + ' '); // 十个函数共用一个闭包// }// }// 闭包解决(function(j) {arr[i] = function() {document.write(j + ' '); // 现在每个立即执行函数形参 j 的值都不一样,用一次就销毁了}})(i);}return arr;}
或者是用 let
| const
来解决闭包问题