当前位置:网站首页>闭包是什么?闭包造成的内存泄漏又怎么解决?
闭包是什么?闭包造成的内存泄漏又怎么解决?
2022-04-22 02:31:00 【不一213】
本文围绕三个二级目录展开描述闭包与内存泄漏,请看下文:
闭包是什么?
一.维基百科对闭包的定义:
- 闭包又称此法闭包或函数闭包;
- 是在支持头等函数的编程语言中,实现词法绑定的一种技术;
- 闭包在是实现上是一个结构体,它存储了一个函数和一个关联的环境;
- 闭包跟函数的最大区别在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样及时脱离了捕捉时的上下文,它也能照常运行;
二.MDN对JavaScript闭包的解释:
- 一个函数和对其周围状态的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包。
- 也就是说,闭包让你可以在一个内层函数中访问到期外层函数的作用域。
- 在JavaScript中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
相信大家看了上面的官方解释并不怎么理解闭包是什么?自由变量又是什么?接下来使用一个小demo进行解释:
function foo () {
var name = 'foo'
function bar () {
console.log('bar', name)
}
return bar
}
var fn = foo()
fn() // bar foo
上述示例代码中, bar 函数本身与自由变量name组成了严格意义上的闭包。
一个函数和对其周围状态的引用捆绑在一起(或者说函数被引用包围)对于这句话的理解,此时的一个函数指的就是bar函数,自由变量name就是捆绑在一起的。二者组合就是闭包。
闭包一定会在函数创建的同时被创建出来吗?
在JavaScript中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
这句话我们是怎么理解的呢?如果不访问自由变量也是闭包吗?
接下来继续展示一个小demo进行分析,示例代码如下:
// can函数
var can = 'can'
function can () {
console.log(can)
}
// not函数
function not () {
}
/* 两个不同的函数一个访问了自由变量,一个没有访问自由变量,两个谁是闭包谁又不是闭包呢? 首先,can函数访问了自由变量can,所以他们两个组合称为闭包; 其次,not函数有两种不同的理解: 1. 可以访问自由变量(但这里没有访问)也可称为闭包 2. 没有访问自由变量,称不上闭包 */
个人小结:
一个普通的函数function,如果它可以访问外层作用域的自由变量,那么这个函数就是一个闭包;
从广义上的角度来说,JavaScript中的函数都是闭包;
从狭义的角度来说,JavaScript中一个函数,如果访问了外层作用域的变量,那么它是一个闭包。
闭包造成的内存泄漏怎么解决呢?
内存泄露是指:用动态存储分配函数内存空间,在使用完毕后未释放,导致一直占据该内存单元。直到程序结束。指任何对象在你不再拥有或需要它之后仍然存在。
还是写一个小demo来进行分析,示例代码如下:
function foo () {
var name = 'foo'
var age = 20
function bar () {
console.log(name)
console.log(age)
}
return bar
} // 第二行至第八行为闭包函数 name 和 age 上升为自有变量
var fn = foo()
fn()
fn函数调用完毕之后,foo函数会自动销毁,但foo函数中的变量name和age不会被销毁,因为在bar函数内部进行了访问,并且根据垃圾回收机制,被另一个作用域引用的变量不会被回收。除非bar函数解除调用才能销毁。
如果该函数使用的次数很少,不进行销毁的话就会变为闭包产生的内存泄漏。
说了这么多解决办法是什么呢?只需将该函数赋值为null即可。
示例代码如下(承接上一个代码片段):
fn = null // 阻止内存泄漏
闭包可能会造成内存泄漏,但不是一定会造成。
版权声明
本文为[不一213]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_49002903/article/details/124331105
边栏推荐
- Analysis of header NAT & DHCP protocol
- Software testing · bad taste
- Solve the problem that the search box of select2 in modal is invalid
- MySQL execution process
- 风控产品定额的陷阱都有哪些?
- [※ leetcode sword finger offer 13. Motion range of robot (simple)]
- Database case section
- 我靠,有人在我的代码注释里的“下毒”?
- AI application theory - Smart farm (cattle farm without monitoring)
- 机器学习、深度学习知识点
猜你喜欢

Pychar executes multiple script files at the same time

WSOLA principle and MATLAB simulation

使用navicat将mangodb的数据做转储

Pycharm同时执行多个脚本文件

Evaluation of arithmetic four mixed operation expression
![[※ leetcode refers to the path in offer 12. Matrix (simple)]](/img/88/2c1c7a9954d824495f0b99223ce7fc.png)
[※ leetcode refers to the path in offer 12. Matrix (simple)]

The shortcut key for modifying the drawing board size of illustrator (AI) is shift + O by default

Alibaba P9 explains high concurrency in detail, and shows you how Taobao can resist large-scale second kill activities such as double 11

MySQL execution process

Introduction to Alibaba's super large-scale Flink cluster operation and maintenance system
随机推荐
The shortcut key for modifying the drawing board size of illustrator (AI) is shift + O by default
Unity Game Optimization - Third Edition 阅读笔记 Chapter 1 分析性能问题
[※ leetcode sword finger offer 13. Motion range of robot (simple)]
Wu Enda's machine learning assignment -- Logical Regression
Excel tips - automatically fill adjacent cells
Scala installation and environment configuration
ENSP layer 3 switch connects layer 2 switch and router
CAN初始化流程
2022 software designer examination knowledge points: linear table
Page 107 planning and design of enterprise digital transformation
illustrator(AI)的画板大小尺寸修改快捷键默认是Shift+O
AI application theory - Smart farm (cattle farm without monitoring)
2022年软件设计师考试知识点:线性表
uniapp实现出生日期/时间选择效果
What do you learn about programming
当人们越是接近产业互联网,就越来越能真正的看清它
Complete solution of closure operation in Discrete Mathematics
AI应用说-智慧农场(牛场无人监控)
Softmax operation
golang 1.8泛型测试