闭包真的会导致内存泄漏?

更新日期: 2019-07-08阅读: 3k标签: 内存

今天遇到一个很有争议的问题,在这里分享一下,我相信对于即将面试前端的小伙伴会有帮助的。主要内容是围绕下边的问题展开的,文章涉及到的其他方面的知识点不展开叙述。

问题:闭包会不会造成内存泄漏?


什么是内存泄漏

不再用到的内存,没有及时释放,就叫做内存泄漏。在 js 中,详细一点说就是指我们已经无法再通过js代码来引用到某个对象,但垃圾回收器却认为这个对象还在被引用,因此在回收的时候不会释放它。导致了分配的这块内存永远也无法被释放出来。如果这样的情况越来越多,会导致内存不够用而系统崩溃。


垃圾回收机制

js 引擎为了解决内存泄漏问题,才有了垃圾回收机制,能够让 js 自动的管理内存,将内存中不在使用的变量回收掉,然后释放出内存空间。

js 用了两种策略,一个是标记清除法,另一种是引用计数法,其实他两的实现原理我们只明白一点就是都是通过判断当前的变量是否被引用,如果没有被引用,就说明该变量应该被回收,怎么回收就是上边说得两种策略的事情了。


什么是引用?

再多说一句,什么是引用?所谓的引用就是存储在堆内存中的对象你是直接不能访问的,而是通过栈内存中存储该对象的地址访问的,改地址就保持着对该对象的引用。

就好比一个盒子,盒子里有一块糖,糖和盒子外部有一根绳子连接着,如果你想直接打开盒子取出糖,不好意思,盒子被上锁了,如果你通过绳子将糖从盒子的小孔中取出来是可以的,就相当于我们所说的引用,糖就是所谓的对象,盒子相当于堆内存。


闭包真的会产生内存泄漏?

对闭包有了解的小伙伴知道,闭包的作用就是就是可以在在一个函数的内部可以访问到函数外部的变量。这是因为内部函数对外部函数属于同一作用域内,通过闭包内的函数访问到变量是因为内部函数保持着对变量的引用,当注册一个点击事件的时候,就是一个闭包,当点击事件完成的时候,还会对改变量保持着引用。

这时候网上有很多的歧义,说闭包造成了内存的泄漏,还有很多面试官问闭包造成的内存泄漏,最后通过大量的资料我终于查明白了,虽然很多大量的博客说遇到了闭包泄漏的实际问题,大部分都将原因归结为闭包产生了内存泄漏。其实内存泄漏并不是闭包造成的,而是通过闭包内的函数对变量的引用,闭包不是真正产生内存泄漏的原因!

大量博客记录的实际遇到的闭包产生内存泄漏问题的根本原因就是没有及时的断开对变量的引用,而不是注册监听事件的闭包产生的内存泄漏。如果我们对该引用可以进行控制,就可以解决内存泄漏的问题,而不应该把这个锅甩给无辜的闭包。

如果你在面试中,面试官说到闭包会产生内存泄漏问题,你就可以放弃这家公司了,因为面试官根本也不懂闭包之所以产生内存泄漏的真正原因。


原文来自:https://blog.csdn.net/qq_36903042/article/details/92867327


链接: https://www.fly63.com/article/detial/4102

JavaScript 内存管理和垃圾回收

JavaScript 的内存管理和垃圾回收,是个略生僻的话题,因为在JavaScript 中不显式执行内存操作,不过最好了解它如何工作。

js常见的内存泄漏及解决方法总汇

js具有自动回收垃圾的机制,即执行环境会负责管理程序执行中使用的内存。在C和C++等其他语言中,开发者的需要手动跟踪管理内存的使用情况。在编写js代码时候,开发人员不用再关心内存使用的问题,所需内存的分配 以及无用的回收完全实现了自动管理。

浅谈javaScript内存机制

javaScript内存空间并不是一个经常被提及的概念,想要对JS的理解更加深刻,就必须对内存空间有一个清晰的认:栈与堆、复杂数据类型与基本数据类型、引用数据类型与堆内存

js 把一个对象赋值给另一个对象会指向同一个内存地址

实际上并不是新建一个和原对象(数组也是对象)完全一样的对象,而是把原对象的内存地址直接复制给了另一个对象,也就是说两个对象都是指向同一个内存地址,所以实际上它们就是同一个对象。

php底层原理之垃圾回收机制

php垃圾回收机制,对于PHPer来说是一个不陌生但是又不是很熟悉的内容。那么php是怎么实现对不需要的内存进行回收的呢?首先还是需要了解下基础知识,便于垃圾回收原理内容的理解。

js变量、作用域和内存问题

JavaScript变量可以用来保存两种类型的值:基本类性值和引用类性值。所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题

php中的内存管理

计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的。应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的库函数 向操作系统申请内存。

原生JS与Jquery删除iframe并释放内存-IE

当项目以tab页签方式打开多个iframe窗口时,关闭tab页签同时也需要关闭iframe并释放内存资源,主要是针对IE浏览器。

Web 应用的内存优化

随着 Web 应用复杂程度越来越高,以及 NodeJS 大规模投入生产环境,许多 Web 应用都会长时间运行, JavaScript 的内存管理显得更为重要。JavaScript 具备自动回收垃圾的机制

Js内存泄露

用户一般不会在一个 Web 页面停留比较久,即使有一点内存泄漏,重载页面内存也会跟着释放。而且浏览器也有自动回收内存的机制,所以我们前端其实并没有像 C、C++ 这类语言一样,特别关注内存泄漏的问题。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!