异步Javascript递归

Rya*_*yan 5 javascript asynchronous

我现在不知道如何在脑子里问这个问题,所以请耐心等待.我是异步编程的新手,我认为最好的学习方法是制作一个小的pavascript pong游戏.我开始使用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);
}
Run Code Online (Sandbox Code Playgroud)

我不是大不必要的递归的忠实粉丝,但我只想尝试一下.瞧,它看起来完全像我期望的那样.但是当我开始充实其余的程序时,我突然意识到我无法避免这种递归性质.所以我的问题:javascript是否以某种方式认识到调用"射击"功能基本上在调用clearInterval后完成了?或者这真的发现自己加载我的堆栈与不必要的激活记录?提前感谢您提供的任何专业知识.

Ber*_*rgi 4

javascript 是否以某种方式识别出调用“shootball”函数在调用clearInterval 后基本上已完成?

不,shootball很久以前就完成了,就在分配给 后ballmotion。然而,它的变量作用域(anglespeedballmotion父作用域)确实持续存在,因为匿名函数用它构建了一个闭包并从外部(从调度程序)引用。clearInterval在删除对它的引用的调用之后,该范围将被垃圾收集。

这真的会在我的堆栈中加载不必要的激活记录吗?

setTimeout不会。通过/执行的每个函数都setInterval在自己的执行上下文中运行,并具有全新的调用堆栈。