5

今、頭の中でグルグル回っている質問の仕方がわからないので、我慢してください。私は非同期プログラミングの初心者であり、学ぶための最良の方法は、小さな JavaScript ピンポン ゲームを作成することだと考えました。私は、shootball() 関数から始めて、別の div の周りで div をバウンスしました。私がこれを行った方法は、次のようなものでした:

function shootball(angle, speed){
    angle = (angle/360.0)*2*Math.PI;
    var ballmotion = setInterval(function(){
        var nowx, nowy, minusY, plusX;
        nowx = $("#ball").position().left;
        nowy = $("#ball").position().top;
        minusY = Math.sin(angle) * 4.0;
        plusX = Math.cos(angle) * 4.0;
        if(hitsWall(nowx+plusX, nowy-minusY)){
            clearInterval(ballMotion);
            shootball(newAngle(nowx+plusX, nowy-minusY), speed);
        }
        $("#ball").css("left", (nowx + plusX)).css("top", (nowy - minusY));
     }, 10/speed);
}

私は大きな不必要な再帰の大ファンではありませんが、試してみたかっただけです。見よ、それは私が期待したとおりに機能する。しかし、プログラムの残りの部分を具体化し始めたとき、この再帰的な性質を避ける方法がないことに気づきました。だから私の質問: javascript は、clearInterval を呼び出した後に呼び出し元の「シュートボール」関数が本質的に終了したことを何らかの方法で認識しますか? それとも、不要なアクティベーション レコードでスタックに負荷がかかるのでしょうか? これが盛り上がる可能性のある専門知識を事前に感謝します。

4

1 に答える 1

4

javascriptは、clearIntervalを呼び出した後、「シュートボール」関数の呼び出しが本質的に終了したことを何らかの形で認識しますか?

いいえ、shootballずっと前に、への割り当ての直後に終了しましたballmotion。ただし、その変数スコープ ( anglespeedballmotionおよび親スコープ) は、無名関数がそれを使用してクロージャーを構築し、外部から (スケジューラーから) 参照されたため、存続しました。clearIntervalそして、そのスコープは、それへの参照を削除した呼び出しの後にガベージコレクションされます。

これは本当に不要なアクティベーション レコードでスタックをロードするのでしょうか?

setTimeoutいいえ。 /を介して実行されるすべての関数はsetInterval、独自の実行コンテキストで実行され、新しいコール スタックが使用されます。

于 2013-06-13T15:04:17.450 に答える