闭包的理解

什么是闭包

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

闭包特性:

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

相关推荐
Yiyaoshujuku2 分钟前
化合物数据集API接口(数据结构及样例)
java·网络·数据结构
plainGeekDev14 分钟前
算法刷题笔记:一维DP没那么难,状态想清楚就赢了一半
java·算法·面试
IceBing19 分钟前
还在一个个连接 Arthas?这个开源平台支持批量诊断 JVM
java
eggrall22 分钟前
Linux线程:并发编程的双刃剑
jvm
SL_staff26 分钟前
《如何用规则引擎替代if-else?JVS-Rules可视化编排比硬编码强在哪里?》
java·低代码·架构
绵绵细雨中的乡音28 分钟前
监控显示一切正常,可用户根本打不开网站——Blackbox Exporter帮我找到了真相(1)
开发语言·php
c++之路28 分钟前
CMake 系列教程(五):进阶技巧
c语言·开发语言·c++
踏着七彩祥云的小丑29 分钟前
Go学习第5天:变量作用域 + 数组 + 指针
开发语言·学习·golang·go
Sam_Deep_Thinking35 分钟前
java中的class到底是个什么东西?
java·开发语言·面试
swordbob38 分钟前
Spring 3 级缓存解决循环依赖
java·spring