JavaScript中的闭包是什么?JavaScript中闭包造成的内存泄漏又怎么解决?

简介: JavaScript中的闭包是什么?JavaScript中闭包造成的内存泄漏又怎么解决?

本文围绕三个二级目录展开描述闭包与内存泄漏,请看下文:


闭包是什么?

一.维基百科对闭包的定义:

闭包又称此法闭包或函数闭包;

是在支持头等函数的编程语言中,实现词法绑定的一种技术;

闭包在是实现上是一个结构体,它存储了一个函数和一个关联的环境;

闭包跟函数的最大区别在于,当捕捉闭包的时候,它的自由变量会在捕捉时被确定,这样及时脱离了捕捉时的上下文,它也能照常运行;

二.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  // 阻止内存泄漏

闭包可能会造成内存泄漏,但不是一定会造成。


目录
相关文章
|
1月前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
1月前
|
JavaScript 前端开发 Java
避免 JavaScript 中的内存泄漏
【10月更文挑战第30天】避免JavaScript中的内存泄漏问题需要开发者对变量引用、事件监听器管理、DOM元素操作以及异步操作等方面有深入的理解和注意。通过遵循良好的编程实践和及时清理不再使用的资源,可以有效地减少内存泄漏的风险,提高JavaScript应用程序的性能和稳定性。
|
27天前
|
监控 JavaScript 算法
如何使用内存监控工具来定位和解决Node.js应用中的性能问题?
总之,利用内存监控工具结合代码分析和业务理解,能够逐步定位和解决 Node.js 应用中的性能问题,提高应用的运行效率和稳定性。需要耐心和细致地进行排查和优化,不断提升应用的性能表现。
180 77
|
27天前
|
监控 JavaScript
选择适合自己的Node.js内存监控工具
选择合适的内存监控工具是优化 Node.js 应用内存使用的重要一步,它可以帮助你更好地了解内存状况,及时发现问题并采取措施,提高应用的性能和稳定性。
115 76
|
27天前
|
监控 JavaScript 数据库连接
解读Node.js内存监控工具生成的报告
需要注意的是,不同的内存监控工具可能会有不同的报告格式和内容,具体的解读方法可能会有所差异。因此,在使用具体工具时,还需要参考其相关的文档和说明,以更好地理解和利用报告中的信息。通过深入解读内存监控报告,我们可以不断优化 Node.js 应用的内存使用,提高其性能和稳定性。
100 74
|
29天前
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
117 62
|
29天前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
124 52
|
1月前
|
JavaScript 前端开发
js 闭包的优点和缺点
【10月更文挑战第27天】JavaScript闭包是一把双刃剑,在合理使用的情况下,它可以带来很多好处,如实现数据封装、记忆功能和模块化等;但如果不注意其缺点,如内存泄漏、变量共享和性能开销等问题,可能会导致代码出现难以调试的错误和性能问题。因此,在使用闭包时,需要谨慎权衡其优缺点,根据具体的应用场景合理地运用闭包。
115 58
|
25天前
|
存储 缓存 监控
如何使用内存监控工具来优化 Node.js 应用的性能
需要注意的是,不同的内存监控工具可能具有不同的功能和特点,在使用时需要根据具体工具的要求和操作指南进行正确使用和分析。
66 31
|
29天前
|
缓存 监控 JavaScript
避免在Node.js中出现内存泄漏
总之,避免内存泄漏需要在开发过程中保持谨慎和细心,遵循最佳实践,不断优化和改进代码。同时,定期进行内存管理的检查和维护也是非常重要的。通过采取这些措施,可以有效地降低 Node.js 应用中出现内存泄漏的风险,确保应用的稳定和性能。