nsiTimer可以在重复使用时导致溢出或内存问题吗?

时间:2012-06-16 00:16:12

标签: javascript firefox timer

mozilla docs中说:

  

initWithCallback():初始化一个定时器,在给定的毫秒间隔后触发。这个版本需要一个函数来调用和一个闭包来传递给那个函数。

在此代码示例中:

setupTimer: function() {
    var waitPeriod = getNewWaitPeriod();

    myTimer.initWithCallback({ 
        notify: function(t) {
            foo();
            setupTimer();
        }
    },
    waitPeriod,
    Components.interfaces.nsITimer.TYPE_ONE_SHOT);
}

传递给函数的闭包实际包含了多少。闭包是否保留整个堆栈的副本?此代码示例是否存在堆栈溢出或永久增加内存使用的风险?

1 个答案:

答案 0 :(得分:0)

理论上,闭包会保留闭包范围内的所有内容(因此在本例中,setupTimer中的局部变量加上setupTimer本身关闭的任何变量)。请注意,这与callstack不同:JS中的闭包范围是词法,而不是动态,所以无论你如何到达函数,只看函数的来源是什么样的。

实际上,JS引擎会大量优化闭包,以加快对闭包中裸字的访问速度,因此闭包实际保持活动的一组内容可能比我上面描述的理论集小。但我不会依赖于此。