重复使用时,nsiTimer 会导致溢出或内存问题吗?

Can nsiTimer cause overflow or memory issues upon repeated use?

本文关键字:溢出 内存 问题 nsiTimer      更新时间:2023-09-26

在 Mozilla 文档中它说:

initWithCallback():初始化一个计时器,使其在给定的毫秒间隔后触发。此版本需要一个函数来调用,并将一个闭包传递给该函数。

在此代码示例中:

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

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

理论上,闭包保留了闭包范围内的所有内容(因此在这种情况下,setupTimer 中的局部变量加上 setupTimer 本身关闭的任何变量)。 请注意,这与调用堆栈不同:JS中的闭包作用域是词法的,而不是动态的,所以你如何到达你的函数并不重要,重要的是函数的源代码是什么样子的。

在实践中,JS引擎极大地优化了闭包,以加快对闭包中裸词的访问,因此闭包实际保持活动状态的集合可能小于我上面描述的理论集合。 但我不会依赖这个。