JavaScript闭包造成内存泄漏的一个例子

看下面代码:

function readData() {
  var buf = new Buffer(1024 * 1024 * 100)
  var index = 0
  buf.fill('g')  

  return function() {
    index++
    if (index < buf.length) { 
      return buf[index-1]   
    } else {
      return ''
    } 
  }
}

var data = readData()
var next = data()
while (next !== '') {
  // process data()
  next = data()
}

readData()返回一个函数,就是说返回了一个闭包。闭包引用了readData()函数中的局部变量buff
var data = readData()执行完后,readData()的局部变量buf不会被释放。

这是因为data变量引用了readData()返回的闭包,而该闭包又引用了变量buf,所以javascript引擎不会回收buf内存。
所以,写类似这样的代码,一定要记住手动清除引用:

function readData() {
  var buf = new Buffer(1024 * 1024 * 100)
  var index = 0
  buf.fill('g')  

  return function() {
    index++
    if (index < buf.length) { 
      return buf[index-1]   
    } else {
      buf = null; // 不再使用buf, 手动清除引用。
      return ''
    } 
  }
}

var data = readData()
var next = data()
while (next !== '') {
  // process data()
  next = data()
}

你可能感兴趣的:(JavaScript)