为了防止这些问题产生,可以在你的JaveScript文件开首应用'use strict';。这个可以应用一种严格的模式解析JavaScript来阻拦不测的全局变量。
除了不测创建的全局变量,明白创建的全局变量同样也很多。这些当然属于不克不及被收受接收的(除非被指定为null或者从新分派)。特别那些用于临时存储数据的全局变量,是异常重要的。如不雅你必须要应用全局变量来存储大年夜量数据,确保在是应用完成之后为其赋值null或者从新赋其他值。
2: 被遗忘的准时器或者回调
在JavaScript中应用setInterval是十分布见的。
动态分派
大年夜多半库,特别是供给不雅察器或其他接收回调的实用函数的,都邑在本身的实例无法拜访前把这些回调也设置为无法拜访。但涉及setInterval时,下面如许的代码十分布见:
我们在SessionStack尽力遵守这些最佳实践,因为:
- var serverData = loadData();
- setInterval(function() {
- var renderer = document.getElementById('renderer');
- if(renderer) {
- renderer.innerHTML = JSON.stringify(serverData);
- }
- }, 5000); //每5秒履行一次
- function foo(arg) {
- bar = "some text";
- }
准时器可能会导致对不须要的节点或者数据的引用。
renderer对象在将来竽暌剐可能被移除,让interval处理器内部的┞符个块都变得没有效。但因为interval仍然起感化,处理法度榜样并不克不及被收受接收(除非interval停止)。如不雅interval不克不及被收受接收,它的依附也弗成能被收受接收。这就意味着serverData,大年夜概保存了大年夜量的数据,也弗成能被收受接收。
在不雅察者的情况下,在他们不再被须要(或相干对象须要设置成不克不及达到)的时刻明白的调用移除是异常重要的。
在膳绫擎的例子中(轮回引用的那个),在函数履行完之后,这个2个对象没有被任何可以达到的全局对象所引用。是以,他们将会被垃圾收受接收器发明为弗成达到的。
在以前,这一点尤其重要,因为某些浏览器(旧的IE6)不克不及很好的治理轮回引用(更多信息见下文)。如今,大年夜部分的浏览器都能并且会在对象变得弗成达到的时刻收受接收不雅察处理器,即使监听器没有被明白的移除掉落。然而,在对象被处理之前,要显式地删除这些不雅察者仍然是值得倡导的做法。例如:
- var element = document.getElementById('launch-button');
- var counter = 0;
- function onClick(event) {
- counter++;
- element.innerHtml = 'text ' + counter;
- }
- element.addEventListener('click', onClick);
- // 做点事
- element.removeEventListener('click', onClick);
- element.parentNode.removeChild(element);
- // 当元素被烧毁
- //元素和事宜都邑即使在老的浏览器里也会被收受接收
如今的浏览器(包含IE和Edge)应用现代的垃圾收受接收算法,可以急速发明并处理这些轮回引用。换句话说,先调用removeEventListener再删省抱病非严格须要。
jQuery等框架和插件会在丢弃节点前删除监听器。这都是它们内部处理,以包管不会产生内存泄漏,甚至是在有问题的浏览器(没错,IE6)上也不会。
3: 闭包
闭包是JavaScript开辟的一个关键方面:一个内部函数应用了外部(封闭)函数的变量。因为JavaScript运行时实现的不合,它可能以下面的方法造成内存泄漏:
- var theThing = null;
推荐阅读
微软雅黑升级:Windows 10 RS4快速预览版17025更新内容大全
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!改良微软雅黑字体:正如大年夜中国Windows Insider会员收集的反馈,微软雅黑是用中文(简体)说话来显示Windows UI文本的字>>>详细阅读
本文标题:如何处理JavaScript内存泄露
地址:http://www.17bianji.com/lsqh/38229.html
1/2 1