1.闭包是什么
当一个函数内部访问了外部作用域的变量,则称为闭包。 比如函数嵌套函数时,内层函数引用了外层函数作用域下的变量,就形成了闭包。
2.如何实现闭包
举个例子
简易版写法:
const add2 = (function () {
let count = 0;
return function add() {
console.log(count++);
};
})();
add2()
add2()
add2()
内存图大致如下,主要关注红圈部分
由于全局对象add2对add函数对象有引用,并且该函数对象的作用域链这中有对立即执行函数产生的AO对象有引用,所以红圈部分所产生的的AO对象并不会被垃圾回收。(这里[[scopes]]内存图未画,为简化版)
加强版写法:
const api = (function () {
let count = 0;
return {
add: () => {
count++;
},
sub: () => {
count--;
},
get: () => count,
};
})();
用法: 变量既想反复使用,又想避免全局污染如何使用?
- 1.定义外层函数,封装被保护的局部变量。
- 2.定义内层函数,执行对外部函数变量的操作。
- 3.外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。
3.闭包的优点
- 维持变量,不被垃圾回收
- 避免了全局污染
- 只提供对局部变量的间接访问。
4.闭包使用不当
由于闭包会使得函数中的变量都被保存在内存中,如果滥用闭包,会导致内存消耗很大,造成网页的性能问题。