惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
博客园 - 三生石上(FineUI控件)
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
About on SuperTechFans
The GitHub Blog
The GitHub Blog
U
Unit 42
H
Hackread – Cybersecurity News, Data Breaches, AI and More
云风的 BLOG
云风的 BLOG
IT之家
IT之家
MyScale Blog
MyScale Blog
V
Visual Studio Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
I
InfoQ
博客园 - 司徒正美

博客园 - 木乃伊人

MCP Server部署到云端服务器 MCP 开发 VS Code 搭建LangChain开发环境 VSCode Unable to import XXX 问题解决记录 大模型应用开发-聊天机器人-保存聊天记录 try-catch中的throw和throw ex的区别 TDD Google Chrome 默认非安全端口列表 EF Core的预先加载、延迟加载、实体追踪 同步、异步、回调 软件设计原则 UML类图 Seq Serilog 多线程整理 Vuex和Pinia Vue3+TS+Vite+pinia 枚举 Vite创建Vue3项目 IdentitySrever4 ElasticSearch 前端防止重复提交案例
闭包
木乃伊人 · 2024-03-27 · via 博客园 - 木乃伊人

一、概念

       当通过调用外部函数返回的内部函数后,即使外部函数已经执行结束,但是被内部函数引用的外部函数变量依然会保存在内存中。我们把引用了其他函数作用域变量的函数和这些被引用变量的集合,称为闭包(Closure)。

二、闭包实现

       闭包指的是一个函数可以访问它定义时所在的词法作用域以及全局作用域中的变量。以js为例:

      具体的说就是:当内部函数引用外部函数变量时,外部函数的作用域将被保留在内存中,以便内部函数可以访问这些变量。

三、用途

       3.1、封装私有变量

                 闭包可以用于封装私有变量,防止其被外部访问和修改。

    3.2、缓存

             函数一旦执行完毕,其内存就会被销毁,而因为闭包,其内部作用域的内存得以保存。

    3.3、模块化编程(实现共有变量)

             闭包还可以用于实现模块化编程。模块化编程是一种将程序拆分为小的,独立的,可重用的模块编程风格。闭包可以用于封装模块的私有变量和方法,以防止其被外部访问和修改。

 四、缺点

        闭包会引用外部函数变量,这些变量在外部函数执行完毕后没有被释放,会一直存在于内存中,总内存不变的情况下,可用内存变小。一旦形成闭包,只有在页面关闭后,闭包占用内存才会被回收,会导致内存泄漏

 五、处理

  1.  及时释放闭包。手动调用闭包函数,并将其返回值赋值为null,如此可以让闭包中的变量即使被垃圾回收器回收。
  2. 使用立即执行函数。创建闭包时,将需要保留的变量传递给一个立即执行函数,并将这些变量作为参数传递给闭包函数。这样即可以保留所需变量,而不会导致其他变量的内存泄漏。