闭包的理解

什么是闭包

在函数内层的作用域中访问函数外层的作用域中的变量,就形成了一个闭包,闭包会使其私有变量的生命周期得到提升至与外层作用域一致。

闭包特性:

1.拥有私有变量

  1. 延长私有变量的生命周期

一般函数中的变量在函数被执行完成之后就会直接销毁,但是闭包中的变量由于通过返回闭包函数被外部作用域所接收引用,使得其生命周期继承至与外部作用域的生命周期 一致,即使其上下文环境已被销毁。

javascript 复制代码
const closures = () => {
    let a = 0;
    return function fn() {
        a++
        return a;
    }
}

使用场景

柯里化函数:避免频繁调用具有相同参数的函数,也能够提高复用性

javascript 复制代码
// 假设我们有一个求长方形面积的函数
function getArea(width, height) {
    return width * height
}
// 如果我们碰到的长方形的宽老是10
const area1 = getArea(10, 20)
const area2 = getArea(10, 30)
const area3 = getArea(10, 40)
javascript 复制代码
//使用柯里化函数
export const getArea = (width) => {
    return (height) => {
        return width * height
    }
}
javascript 复制代码
// 先定义宽度为10
const getWidthOfArea = getArea(10)
// 对于宽度为10的长方形,直接写入高度即可
getWidthOfArea(20);
getWidthOfArea(30)

模拟私有方法

javascript 复制代码
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变量被引用了所以不会被回收

相关推荐
查古穆7 分钟前
python进阶-Pydantic模型
开发语言·python
沐知全栈开发10 分钟前
Bootstrap4 导航栏
开发语言
kyriewen1113 分钟前
异步编程:从“回调地狱”到“async/await”的救赎之路
开发语言·前端·javascript·chrome·typescript·ecmascript·html5
AI+程序员在路上16 分钟前
嵌入式软件技术大全
linux·开发语言·arm开发·单片机
吴声子夜歌16 分钟前
JavaScript——数据类型
开发语言·javascript·ecmascript
black方块cxy22 分钟前
实现一个输入框多个ip以逗号分隔最多20组,且ip不能重复
java·服务器·前端
2401_8796938736 分钟前
C++中的观察者模式实战
开发语言·c++·算法
工頁光軍1 小时前
基于Python的Milvus完整使用案例
开发语言·python·milvus
wregjru1 小时前
【网络】8.五种 I/O 模型与多路转接详解
开发语言·php
fff9811181 小时前
C++与Qt图形开发
开发语言·c++·算法