JavaScript中易犯的小错误-------常见错误三:内存泄露

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript中易犯的小错误-------常见错误三:内存泄露相关的知识,希望对你有一定的参考价值。

国庆放假,今天开始继续!!!!!!!!!!!

javascript中易犯的小错误-------常见错误三:内存泄露

 

内存泄露在js变成中几乎是一个无法避免的问题。如果不是特别细心的话,在最后的检查过程中,肯定会出现各种内存泄露问题。下面我们就来举例说明一下:
var theThing = null;
var replaceThing = function () {
     var priorThing = theThing;
     var unused = function () {
           if (priorThing) {

          console.log("hi");

          }
};
theThing = {

     longStr: new Array(1000000).join(‘*‘), //
     someMethod: function () {

console.log(someMessage);

}
};
};
setInterval(replaceThing, 1000);
如果运行上面的代码,你会发现你已经造成了大量的内存泄露,每秒泄露1M的内存,显然光靠GC(垃圾回收器)是无法帮助你的了。由上面的代码来看,似乎是longstr在每次replaceThing调用的时候都没有得到回收。这是为什么呢?
每一个theThing结构都含有一个longstr结构列表。每一秒当我们调用 replaceThing, 它就会把当前的指向传递给 priorThing. 但是到这里我们也会看到并没有什么问题,因为 priorThing 每回也是先解开上次函数的指向才会接受新的赋值。并且所有的这一切都是发生在 replaceThing 函数体当中,按常理来说当函数体结束之后,函数中的本地变量也将会被GC回收,也就不会出现内存泄露的问题了,但是为什么会出现上面的错误呢?
这是因为longstr的定义是在一个闭包中进行的,而它又被其他的闭包所引用,js规定,在闭包中引入闭包外部的变量时,当闭包结束时此对象无法被垃圾回收(GC)。

 

以上是关于JavaScript中易犯的小错误-------常见错误三:内存泄露的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中易犯的小错误-------常见错误四:比较运算符

JavaScript中易犯的小错误-------常见错误五:低效的DOM操作

JavaScript中易犯的小错误-------常见错误二:传统编程语言的生命周期误区

十个JavaScript中易犯的小错误,你中了几枪?

CSS网页布局中易犯的10个小错误

遍历时常犯的小错误以及属性attr 和 prop