闭包的理解

什么是闭包

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

闭包特性:

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

相关推荐
苏-言21 分钟前
SpringMVC 实战指南:文件上传
java·后端·spring
m0_7482507421 分钟前
SpringMVC详解
java
nanzhuhe26 分钟前
tomcat状态一直是Exited (1)
java·tomcat
m0_748241121 小时前
【Spring】获取Cookie和Session(@CookieValue()和@SessionAttribute())
java·后端·spring
Eiceblue1 小时前
在.NET用C#将Word文档转换为HTML格式
开发语言·vscode·c#·html·word·.net
步、步、为营1 小时前
C#局部函数 VS Lambda表达式
开发语言·windows·c#
Kevinyu_1 小时前
Java ArrayList
java·开发语言·windows
忆源1 小时前
Linux高级--3.3.1 C++ spdlog 开源异步日志方案
java·c++·开源
stormjun1 小时前
基于 Python 的深度学习的车俩特征分析系统,附源码
开发语言·python·深度学习·车辆特征分析·python 车辆特征分析
BinaryBardC1 小时前
Dart语言的字符串处理
开发语言·后端·golang