我现在不知道如何在脑子里问这个问题,所以请耐心等待.我是异步编程的新手,我认为最好的学习方法是制作一个小的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执行的每个函数都在自己的执行上下文中运行,并带有一个全新的调用堆栈.