异步Javascript递归

时间:2013-06-13 14:55:22

标签: 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);
}

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

1 个答案:

答案 0 :(得分:4)

  

javascript是否以某种方式认识到调用clearInterval后调用“shootball”函数基本上完成了?

不,shootball很久以前就已经完成,就在分配到ballmotion之后。但是,它的变量范围(anglespeedballmotion和父范围)确实存在,因为匿名函数使用它构建了一个闭包,并从外部(从调度程序)引用。并且该范围将在clearInterval调用之后收集垃圾,该调用删除了对它的引用。

  

这真的发现自己用不必要的激活记录加载我的堆栈吗?

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