javascript内存泄漏有哪些原因

  介绍

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

javascript内存泄漏的原因:1、全局变量使用不当;2、闭包使用不当;3,延时器或定时器没有被清除;4,没有清理的DOM元素引用(DOM清空或删除时,事件未清除)。

本教程操作环境:windows7多系统,javascript1.8.5版,戴尔G3电脑。

<强>内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。即指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。这里就讲一些常见会带来内存泄露的原因。

1。全局变量

JavaScript可以处理没有声明的变量:一个未声明的变量的引用在全局对象中创建了一个新变量。在浏览器的环境中,全局对象是窗口。

function  foo () {   时间=name 才能;& # 39;前端曰& # 39;;   }//,其实是把名字变量挂载在窗口对象上   function  foo () {   时间=window.name 才能;& # 39;前端曰& # 39;;   }//,又或者   function  foo () {   时间=this.name 才能;& # 39;前端曰& # 39;;   }   foo(),//,其实这里的这就是指向的窗口对象

这样无意中一个意外的全局变量就被创建了,为了阻止这种错误发生,在你的Javascript文件最前面添加“使用严格;”。这开启了解析Javascript的阻止意外全局的更严格的模式,或者自己注意好变量的定义。

2。闭包

闭包:匿名函数可以访问父级作用域的变量。

var  names =,(函数(){,,   ,,,var  name =, & # 39; js-say& # 39;;   ,,,return 函数(){   ,,,,,,,console.log(名称);   ,,,}   })()

闭包会造成对象引用的生命周期脱离当前函数的上下文,如果闭包使用不当,可以导致环形引用(循环引用),类似于死锁,只能避免,无法发生之后解决,即使有垃圾回收也还是会内存泄露。

3。被遗忘的延时器/定时器

在我们的日常需求中,可能会经常试用到setInterval/setTimeout,但是使用完之后通常忘记清理。

var  someResource =, getData (),,   setInterval(函数(),{,   ,,,var  node =, . getelementbyid(& # 39;节点# 39;),,   ,,,如果(节点),{,   ,,,,,,,//,处理,node 和,someResource    ,,,,,,,node.innerHTML =, JSON.stringify(外域)),,   ,,,},   },,1000);

setInterval/setTimeout中这个指的向的是窗口对象,所以内部定义的变量也挂载到了全局;如果内引用了外域变量,如果没有清除setInterval/setTimeout的话外域也得不到释放,同理其实setTimeout也一样,所以我们用完需要记得去clearInterval/clearTimeout。

<强> 4,没有清理的DOM元素引用(DOM清空或删除时,事件未清除)

var  elements =, {   ,,,按钮:,. getelementbyid(& # 39;按钮# 39;),   ,,,的形象:,. getelementbyid(& # 39;图像# 39;),   文本:,,,,. getelementbyid(& # 39;文本# 39;)   };   function  doStuff (), {   ,,,image.src =, & # 39; http://some.url/image& # 39;;   ,,,button.click ();   ,,,console.log (text.innerHTML);   }   function  removeButton (), {   ,,,document.body.removeChild (. getelementbyid(& # 39;按钮# 39;));   ,,,//,此时,仍旧存在一个全局的,# button 的引用   ,,,//,elements 字典.button 元素仍旧在内存中,不能被,GC 回收。   }

javascript内存泄漏有哪些原因