返回顶部
首页 > 资讯 > 前端开发 > VUE >javascript闭包会造成内存泄漏吗
  • 147
分享到

javascript闭包会造成内存泄漏吗

2024-04-02 19:04:59 147人浏览 独家记忆
摘要

本篇内容介绍了“javascript闭包会造成内存泄漏吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.

本篇内容介绍了“javascript闭包会造成内存泄漏吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1. 标记清除

JavaScript  中最常用的垃圾收集方式是标记清除(mark-and-sweep)。垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记(可以使用任何标记方式)。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。***,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。

2. 引用计数

引用计数(reference  counting)的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。当这个值的引用次数变成0  时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾收集器下次再运行时,它就会释放那些引用次数为零的值所占用的内存。

Netscape Navigator 3.0 是最早使用引用计数策略的浏览器,但很快它就遇到了一个严重的问题,请看下面这个例子:

function problem(){     var objectA = new Object();     var objectB = new Object();     objectA.someOtherObject = objectB;     objectB.anotherObject = objectA; }

说明:objectA 和objectB  通过各自的属性相互引用,即这两个对象的引用次数都是2,在采用标记清除策略的实现中,由于函数执行之后,这两个对象都离开了作用域,因此这种相互引用不是个问题。但在采用引用计数策略的实现中,当函数执行完毕后,objectA  和objectB 还说明将继续存在,因为它们的引用次数永远不会是0。假如这个函数被重复多次调用,就会导致大量内存得不到回收。

为此,Netscape 在Navigator 4.0  中放弃了引用计数方式,然而引用计数导致的麻烦并未就此了结。IE9以前中有一部分对象并不是原生JavaScript 对象。例如,其BOM 和DOM  中的对象就是使用c++以COM(Component Object Model,组件对象模型)对象的形式实现的,而COM  对象的垃圾收集机制采用的就是引用计数策略。因此,即使IE 的JavaScript 引擎是使用标记清除策略来实现的,但JavaScript 访问的COM  对象依然是基于引用计数策略的。换句话说,只要在IE 中涉及COM 对象,就会存在循环引用的问题。

比如:

var element = document.getElementById("some_element"); var myObject = new Object(); myObject.element = element; element.someObject = myObject;

DOM 元素(element)与一个原生JavaScript 对象(myObject)之间创建了循环引用。其中,变量myObject  有一个名为element 的属性指向element 对象;而变量element 也有一个属性名叫someObject  回指myObject。由于存在这个循环引用,即使将例子中的DOM 从页面中移除,它也永远不会被回收。

解决办法:将变量设为null从而切断变量与它此前引用的值之间的连接。

myObject.element = null;  element.someObject = null;

看完上面的内容,我来谈正题。

闭包不会引起内存泄漏

由于IE9 之前的版本对jscript 对象和COM 对象使用不同的垃圾收集。因此闭包在IE  的这些版本中会导致一些特殊的问题。具体来说,如果闭包的作用域链中保存着一个html 元素,那么就意味着该元素将无法被销毁请看例子:

function assignHandler(){     var element = document.getElementById("someElement");     element.onclick = function(){         alert(element.id);     }; }

以上代码创建了一个作为element  元素事件处理程序的闭包,而这个闭包则又创建了一个循环引用。由于匿名函数保存了一个对assignHandler()的活动对象的引用,因此就会导致无法减少element  的引用数。只要匿名函数存在,element 的引用数至少也是1,因此它所占用的内存就永远不会被回收

解决办法前言已经提到过,把element.id 的一个副本保存在一个变量中,从而消除闭包中该变量的循环引用同时将element变量设为null。

function assignHandler(){     var element = document.getElementById("someElement");     var id = element.id;     element.onclick = function(){         alert(id);     };     element = null; }

“javascript闭包会造成内存泄漏吗”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: javascript闭包会造成内存泄漏吗

本文链接: https://lsjlt.com/news/86287.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • javascript闭包会造成内存泄漏吗
    本篇内容介绍了“javascript闭包会造成内存泄漏吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1....
    99+
    2024-04-02
  • JavaScript闭包用多会造成内存泄露吗
    今天小编给大家分享一下JavaScript闭包用多会造成内存泄露吗的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。.markd...
    99+
    2023-07-05
  • 一文深析闭包用多是否会造成内存泄露
    .markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:16px;overflow-x:hidden;color:#252933}.ma...
    99+
    2023-05-14
    前端 JavaScript
  • 面试官:java ThreadLocal真的会造成内存泄露吗
    目录1、ThreadLocal知识体系2、为什么会被设计为弱引用呢?3、大量Entry造成的内存溢出问题探讨总结1、ThreadLocal知识体系 本文还是不能免俗,在回答这个问题之...
    99+
    2024-04-02
  • vue中的eventBus会产生内存泄漏吗
    这篇文章主要介绍了vue中的eventBus会产生内存泄漏吗,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。eventBus是在vue中经常用来解决跨组件消息传递的问题,但对它...
    99+
    2023-06-29
  • vue中的eventBus会不会产生内存泄漏你知道吗
    目录引入内容eventBus在vue中的实现例子:使用eventBus例子:不及时取消订阅其它注意事项总结eventBus是在vue中经常用来解决跨组件消息传递的问题,但对它的使用要...
    99+
    2024-04-02
  • JavaScript内存泄漏实例分析
    这篇文章主要讲解了“JavaScript内存泄漏实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript内存泄漏实例分析”吧!js 内存泄...
    99+
    2024-04-02
  • JavaScript中内存泄漏怎么办
    这篇文章主要介绍JavaScript中内存泄漏怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、什么是内存泄漏?程序的运行需要内存。只要程序提出要求,操作系统或者运行时(run...
    99+
    2024-04-02
  • 怎么排查Javascript内存泄漏
    这篇文章主要讲解了“怎么排查Javascript内存泄漏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么排查Javascript内存泄漏”吧!如何判断我的应用发生了内存泄漏为了证明螃蟹的听...
    99+
    2023-07-02
  • 怎么避免JavaScript内存泄漏
    这篇文章主要介绍“怎么避免JavaScript内存泄漏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么避免JavaScript内存泄漏”文章能帮助大家解决问题。一、什么是内存泄漏JavaScrip...
    99+
    2023-06-30
  • JavaScript内存泄漏和内存溢出是什么
    本篇内容主要讲解“JavaScript内存泄漏和内存溢出是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript内存泄漏和内存溢出是什么”吧! ...
    99+
    2024-04-02
  • Java怎样创建集合才能避免造成内存泄漏你了解吗
    目录双括号语法初始化集合不建议使用这种形式替代方案使用Arrays工具类使用Stream使用第三方工具类Java 9内置方法由于Java语言的集合框架中(collections, 如...
    99+
    2024-04-02
  • JavaScript中怎么防范内存泄漏
    这篇文章给大家介绍JavaScript中怎么防范内存泄漏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。浏览器将对象保留在堆内存中,通过引用链可从根对象到达这些对象。垃圾回收器(GC)是...
    99+
    2024-04-02
  • javascript内存泄漏有哪些原因
    本篇内容介绍了“javascript内存泄漏有哪些原因”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • javascript中怎么防止内存泄漏
    小编给大家分享一下javascript中怎么防止内存泄漏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • JavaScript中的内存泄漏的原因
    目录前言内存泄漏的场景全局变量闭包DOM元素引用总结前言 JavaScript的内存泄漏指的是一些不再需要的对象仍然占用着内存,导致内存使用量持续增加,甚至造成浏览器崩溃或性能下降。...
    99+
    2023-05-18
    JavaScript 内存泄漏
  • 剖析 JavaScript 内存泄漏的根源
    内存泄漏是指 JavaScript 对象或变量在不再需要时仍然被引用,导致应用程序的内存不断增长。这对 Web 应用程序尤其有害,因为它可能会导致性能下降,甚至崩溃。 检测内存泄漏 检测内存泄漏的第一步是使用浏览器工具(如 Chrome ...
    99+
    2024-04-02
  • 没有resolve及reject的Promise是否会造成内存泄露
    目录正文DevTools测试执行queryObjects(Promise)测试事件回调可疑的泄露对象正文 DevTools测试 可以用 DevTools 的 queryObjects...
    99+
    2022-11-13
    Promise内存泄露 Promise内存
  • 一篇文章弄懂javascript内存泄漏
    1、什么是内存泄漏 在了解什么是内存泄漏之前, 我们应该要对内存是什么有个概念, 随机存取存储器(英语:Random Access Memory,缩写:RAM)是与 CPU 直接交...
    99+
    2024-04-02
  • JavaScript中内存泄漏指的是什么
    内存泄漏是指程序中一个对象被分配到内存中既不能使用,又不能回收,留在了堆内存中就称为内存泄漏,当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作