【译】【nodeschool】【scope-chains-closures】垃圾收集

垃圾收集

在JavaScript中内存由运行环境runtime自动管理分配。运行环境决定什么时候、是否去释放那些已分配的内存。这部分决策程序被称为垃圾收集。

每类JavaScript运行环境都有它们自己的垃圾收集算法。但大部门都是使用标记与清理变量去实现垃圾收集。标记与清理算法对那些已经运行过的代码中的可持续访问的内存(分配给变量,内存等)进行标记。任何没有标记的信息将被清理进垃圾箱中(即这部分内存将被释放,可重新分配使用)。

标记可访问内存这个概念与闭包有一些关系:

   someFunc()

        var bar

    return inner

           ↑

       alert(bar)

           ...

当调用someFunc()返回闭包inner()函数时,它将维持对变量bar的引用。标记与清理算法将对变量bar进行标记,使其不被垃圾箱回收并可持续被引用。

为了让inner()函数正确的获取到bar的引用,不仅仅是分配给bar的内存需要被保留,声明变量bar的作用域链同样将被保留。

直到bar的引用不再被inner()函数所需要,它将被垃圾收集给标记,反过来意思就是变量bar同样被标记,斌且最终整个作用域链也被标记。结果就是分配给bar的或者作用域链的内存空间得到释放。

就是这样,作用域,作用域链,闭包,垃圾收集相互关联了起来。

猜你喜欢

转载自my.oschina.net/cc4zj/blog/1815591