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

推荐订阅源

A
About on SuperTechFans
T
Threatpost
L
LangChain Blog
G
GRAHAM CLULEY
Simon Willison's Weblog
Simon Willison's Weblog
W
WeLiveSecurity
T
The Blog of Author Tim Ferriss
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hacker News: Front Page
P
Privacy International News Feed
Microsoft Azure Blog
Microsoft Azure Blog
Apple Machine Learning Research
Apple Machine Learning Research
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Attack and Defense Labs
Attack and Defense Labs
The Hacker News
The Hacker News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
The Register - Security
The Register - Security
Cisco Talos Blog
Cisco Talos Blog
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
H
Help Net Security
U
Unit 42
S
Security Affairs
Engineering at Meta
Engineering at Meta
Forbes - Security
Forbes - Security
The Cloudflare Blog
S
Securelist
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Webroot Blog
Webroot Blog
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Help Net Security
Help Net Security
Latest news
Latest news
SecWiki News
SecWiki News
H
Heimdal Security Blog
IT之家
IT之家
博客园 - Franky
Google DeepMind News
Google DeepMind News
小众软件
小众软件
A
Arctic Wolf
月光博客
月光博客
T
Tailwind CSS Blog
NISL@THU
NISL@THU
GbyAI
GbyAI
N
News and Events Feed by Topic

博客园 - 木乃伊人

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. 使用立即执行函数。创建闭包时,将需要保留的变量传递给一个立即执行函数,并将这些变量作为参数传递给闭包函数。这样即可以保留所需变量,而不会导致其他变量的内存泄漏。