异步Javascript递归

前端之家收集整理的这篇文章主要介绍了异步Javascript递归前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我现在不知道如何在脑子里问这个问题,所以请耐心等待.我是异步编程的新手,我认为最好的学习方法是制作一个小的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后完成了?或者这真的发现自己加载我的堆栈与不必要的激活记录?提前感谢您提供的任何专业知识.

最佳答案

Does javascript somehow recognize that the calling “shootball” function is essentially finished after calling clearInterval?

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

does this really find itself loading up my stack with unnecessary activation records?

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

原文链接:https://www.f2er.com/js/429769.html

猜你在找的JavaScript相关文章