一个有关javascript垃圾回收机制的问题

function fn1(){
    var a=10
    var b=20
    var c=30
    function fn2(){
        alert(a++)
    }
    return fn2
}
var fn3=fn1()
fn3()
fn3()

以上代码,形成了闭包,垃圾回收机制不会回收a变量,但是没有用到的b,c两个变量会被垃圾回收机制回收吗?

阅读 2.6k
3 个回答

未被闭包引用的变量将被回收,可以用console.dir()打印出函数的属性,来查看它[[scope]]:

function fn1(){
    var a=10
    var b=20
    var c=30
    function fn2(){
        alert(a++)
    }
    return fn2
}
console.dir(fn1())

将会得到 fn1 只保留了变量a,变量bc被回收了。

[[Scopes]]: Scopes[2]
    0: Closure (fn1)
        a: 10
    1: Global

如果再添加一个闭包:

var fn4 
function fn1(){
    var a=10
    var b=20
    var c=30
    function fn2(){
        alert(a++)
    }
    fn4 = function () {
        alert(b++)
    }
    return fn2
}
console.dir(fn1())
console.dir(fn4)

可以看到,变量a、b被闭包引用,没有被回收,只有c被回收了

[[Scopes]]: Scopes[2]
    0: Closure (fn1)
        a: 10
        b: 20
    1: Global

谢邀!说一点理论性吧。

内存垃圾回收其实说的就是对象间引用、引用、引用(重要说三遍)关系,不管是全局的亦或局部的,而内存的回不回收取决于对象是否被需要

对象是否被需要在所有现代浏览器当中都使用一种叫标记清除垃圾回收算法(只是不同的浏览器实现的算法或对算法的优化不同,但目标大家都一样)。

对象间引用会产生一个叫GC Root(利用chrome的memory非常容易获取到这个)的东西,而这种算法说白了就是定期的从GC Root开始找到所有能被引用和不能被引用的对象,然后删除那些不能被引用的对象,这就是javascript内存管理的基本本质了。

会的 只能在fn1作用域内访问到b,c

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