标记和扫描JavaScript(上下文变量)



我正在阅读Web开发人员的专业JavaScript

我在阅读"垃圾收集器运行时,它都会标记存储在内存中的所有变量。然后将其标记清除在上下文中的变量和> condorcesed的变量。通过中下文变量。"

我知道何时无法通过任何变量达到对象,将收回关联的内存。

"上下文中的变量"是什么意思?它们是否可以在范围链中找到?但是,"由封闭式变量引用的变量"呢?

我很困惑。

我假设是要避免闭合中使用的变量意外删除变量。在JavaScript中,就像其他任何功能性语言一样,仅仅是无法到达的不足以告诉您天气您应该删除对象。

以以下代码为例:

function a () {
    var x=0;
    return function () {
        alert(x++);
    }
}
var b = a();
// at this point, the instance of `x` created by calling `a` is
// no longer reachable but we are still using it in the closure.

如果我们仅遵循"不可收复"规则,那么创建的闭合将丢失变量x

考虑以下内容:

(function(){
    var sobriety = [];
    window.inception = function() {
        var i = 0, 
            j = 0,
            inner_level = { i: i }, 
            level       = { level: inner_level },
            food        = {};
        return function() { 
            var new_level = {
                level: level.level
            };
            new_level[i] = 'step ' + i;
            new_level.level.i = i;
            sobriety[i++] = new_level; 
        };
    };
    window.show_my_sobriety = function() { console.log(sobriety); };
})();
var agent = inception();
agent(); agent(); agent();
show_my_sobriety();​

Js小提琴。

我承认此示例有些复杂,但是我只需要使其显示i(原始)和inner_level(参考类型)之间的区别。

在这里,我们有一个具有一个sobriety变量本地的模块,并且有两个函数(通过将它们分配给window对象的属性)。请注意,即使已定义的模块完成后,这些全局函数也可以访问sobriety变量(in-context)。

inception函数,当调用时,定义了五个变量:两个标量(ij)和三个引用(inner_levellevelfood),然后定义一个函数。

>

此功能显然访问ilevel(相同的上下文),以及sobriety(外部级别上下文) - 但不能jfood。因此,window.inception完成后,GC将立即收集后者;不过,前者保持未收集 - 因为它们由内部功能转介。

现在是棘手的部分。虽然您在此功能中没有看到inner_level的访问权限,但仍可以访问 - 它是同名对象的level属性的值。而且,当您检查结果时,您会看到所有三个元素具有相同的level.i值 - 等于2。

最新更新