闭包的理解

什么是闭包

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

闭包特性:

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

相关推荐
天选之子1231 小时前
DuckDB学习
jvm·学习
jinyishu_1 小时前
C++ 继承全解:从基础到高级特性
开发语言·c++
接着奏乐接着舞2 小时前
大模型开发 agent 知识库
java
xuhaoyu_cpp_java2 小时前
SpringBoot学习(四)
java·经验分享·spring boot·笔记·学习
plainGeekDev2 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台3 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
小喻同学i3 小时前
std::thread函数参数传递
开发语言·c++
程序员天天困3 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·后端
要开心吖ZSH3 小时前
AI医疗分诊与健康咨询助手agent开发——(4-2)从零到一:我给AI医疗分诊助手加了个“知识库大脑“,终于搞懂了RAG是什么
java·docker·agent·医疗·rag
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第179题】【07_Redis篇】第15题:什么是 Redlock 算法?
java·redis·分布式锁·高可用·redlock