闭包的理解
什么是闭包
在函数内层的作用域中访问函数外层的作用域中的变量,就形成了一个闭包,闭包会使其私有变量的生命周期得到提升至与外层作用域一致。
闭包特性:
1.拥有私有变量
2. 延长私有变量的生命周期
一般函数中的变量在函数被执行完成之后就会直接销毁,但是闭包中的变量由于通过返回闭包函数被外部作用域所接收引用,使得其生命周期继承至与外部作用域的生命周期 一致,即使其上下文环境已被销毁。
const closures = () => {
let a = 0;
return function fn() {
a++
return a;
}
}
使用场景
柯里化函数:避免频繁调用具有相同参数的函数,也能够提高复用性
// 假设我们有一个求长方形面积的函数
function getArea(width, height) {
return width * height
}
// 如果我们碰到的长方形的宽老是10
const area1 = getArea(10, 20)
const area2 = getArea(10, 30)
const area3 = getArea(10, 40)
//使用柯里化函数
export const getArea = (width) => {
return (height) => {
return width * height
}
}
// 先定义宽度为10
const getWidthOfArea = getArea(10)
// 对于宽度为10的长方形,直接写入高度即可
getWidthOfArea(20);
getWidthOfArea(30)
模拟私有方法
var Counter = (function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
}
})();
计时器
回调函数
内存泄漏问题
当闭包函数被return出去并执行被外部变量所接收时,闭包中所访问的私有变量会造成内存泄漏问题
借助垃圾回收机制的标记清除法可以看出:
1.result是一个全局变量,代码执行完后不会立即销毁
2.result使用了fn函数
3.fn函数使用了fun函数
4.fun函数中使用了count变量
5.count变量被引用了所以不会被回收