JS for循环中的对象什么时候被回收?

比如下面两种情况

循环里 通过var 定义变量

for(var i = 0; i < 100; i ++) {
    var obj = new Object();
}

上面的obj对象会在什么时候被回收?是在下一次for循环开始,还是整个for结束呢?

循环里 通过let 定义变量

for(var i = 0; i < 100; i ++) {
    let obj = new Object();
}

如果通过let来定义obj,形成了块级作用域,情况会有所不同吗?

因为通过var定义,不存在块级作用域,obj应该都是一个变量,只是每次obj都被覆盖成了新的对象。这两种定义方式对于对象的回收有影响吗?

阅读 3.1k
2 个回答

这两种写法对于垃圾回收都是没有区别的

没有形成闭包的时候,当“离开环境”或者没有引用时,下次gc过程发生时就可能被回收

你调用函数结束之后,你可以单独写一个demo的

function test(){
  for(var i = 0;i<10;i++){
    var obj = i
  }
  console.log(obj)
}
test() // 9

function test2(){
  for(var i = 0;i<10;i++){
    let obj = i
  }
  console.log(obj)
}
test2() // Uncaught ReferenceError: obj is not defined

看看就知道了,for是一个特殊的函数体,这个你可以去了解一下。

然后回收机制的话,简单总结:

垃圾回收机制依赖引用计数,如果一个值的引用次数不为0,垃圾回收机制就不会释放这块内存。

但是现代浏览器有自己的一个自动回收机制,在内存充裕的情况下不会每次都处理内存回收,毕竟GC是一个有消耗处理。
具体可以看WeakSet/WeakMap数据结构例子,垃圾回收不考虑弱引用,但是其实还在内存中,并没有被回收掉。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题