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()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值