0

mozilla docsには、次のように書かれています。

initWithCallback(): 指定されたミリ秒間隔の後に起動するようにタイマーを初期化します。このバージョンは、呼び出す関数と、その関数に渡すクロージャーを取ります。

このコード例では:

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

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

関数に渡されるクロージャーに実際に含まれる量。クロージャーはスタック全体のコピーを保持していますか? このコード サンプルは、スタック オーバーフローまたはメモリ使用量の永久的な増加のリスクにさらされていますか?

4

1 に答える 1

0

理論的には、クロージャーはクロージャーのスコープ内にあるすべてのものを保持します (したがって、この場合、setupTimer のローカル変数と、setupTimer 自体が閉じる変数)。これはコールスタックとは異なることに注意してください: JS のクロージャー スコープは字句的であり、動的ではないため、どのように関数に到達したかは問題ではなく、関数のソースがどのように見えるかだけです。

実際には、JS エンジンはクロージャー内のベアワードへのアクセスを高速化するためにクロージャーを大幅に最適化するため、クロージャーが実際に維持するもののセットは、上記で説明した理論上のセットよりも小さい可能性があります。しかし、私はそれに依存しません。

于 2012-06-16T04:44:17.043 に答える