广告
返回顶部
首页 > 资讯 > 前端开发 > 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://www.lsjlt.com/news/86287.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • javascript闭包会造成内存泄漏吗
    本篇内容介绍了“javascript闭包会造成内存泄漏吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1....
    99+
    2022-10-19
  • 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+
    2022-11-12
  • vue中的eventBus会产生内存泄漏吗
    这篇文章主要介绍了vue中的eventBus会产生内存泄漏吗,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。eventBus是在vue中经常用来解决跨组件消息传递的问题,但对它...
    99+
    2023-06-29
  • vue中的eventBus会不会产生内存泄漏你知道吗
    目录引入内容eventBus在vue中的实现例子:使用eventBus例子:不及时取消订阅其它注意事项总结eventBus是在vue中经常用来解决跨组件消息传递的问题,但对它的使用要...
    99+
    2022-11-13
  • Java怎样创建集合才能避免造成内存泄漏你了解吗
    目录双括号语法初始化集合不建议使用这种形式替代方案使用Arrays工具类使用Stream使用第三方工具类Java 9内置方法由于Java语言的集合框架中(collections, 如...
    99+
    2022-11-12
  • 没有resolve及reject的Promise是否会造成内存泄露
    目录正文DevTools测试执行queryObjects(Promise)测试事件回调可疑的泄露对象正文 DevTools测试 可以用 DevTools 的 queryObjects...
    99+
    2022-11-13
    Promise内存泄露 Promise内存
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作