码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-10-05 09:05:14      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

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

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中易犯的小错误-------常见错误三:内存泄露

标签:

原文地址:http://www.cnblogs.com/jtr122624520/p/5931721.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!