【问题标题】:Trying to create an infinite for loop that can stop using function doIt()试图创建一个可以停止使用函数 doIt() 的无限 for 循环
【发布时间】:2011-02-16 15:15:41
【问题描述】:

大家好,我是 javascript 新手,我正在为我的期末考试做一个项目。我需要这样做,所以我操纵的这个游戏引擎会导致生成按钮进入无限循环。

我还需要使用 (Reset==1) 来停止它。有什么帮助吗?如果有帮助,这是我目前拥有的代码:

function generation()
{

 for(y2=0; y2<2500; y2++) 
 {
  tempmapactual[y2]=mapactual[y2];
 }

 for (g=0;g<2500;g++)
 {
  neighbours=0;
  for (h=0;h<8;h++)
  {
   if (g+coords[h]>0 && g+coords[h]<2499 && mapactual[g+coords[h]]=="white.gif") 
   {neighbours=neighbours+1;} 
  }
  if (neighbours>=4 || neighbours==1 || neighbours==0) 
   {tempmapactual[g]="black.gif";}

  if (neighbours==3) {tempmapactual[g]="white.gif";}
 }

 for(y3=0; y3<2500; ++y3) 
 {
  if (mapactual[y3]!=tempmapactual[y3])
  {
   mapactual[y3]=tempmapactual[y3];
   document.images[y3+offset].src=mapactual[y3];
  }
 }

} 




</script> 

<script>
function doIt()
{
   for (i=0; i<X; i++)
  {
    // This is where I have trouble. What part of generation() do I call?
  }

     if (Reset==1) break; // This will kill the loop instantly.
  }
}
</script>

<script>
window.onload(doIt($(X).value)));
</script>


<form> 
<input type="button" value="generate" onClick="generation();"> 
</form>

<form>
<input type="text">
</form>

<form>
<input type="button" value="Infinite Loop!" onclick="doIt();"> 
</form>

<form>
<input type="button" value="Reset" onclick="doIt();">
</form>

【问题讨论】:

  • 我将标题中的函数名称读为“dolt”,并认为您想成为一个有趣的人。
  • 哈哈,可惜没有。辛普森一家还在电视上吗!?

标签: loops for-loop infinite


【解决方案1】:

你不能从另一个没有线程的函数中跳出已经运行的无限循环;但是您可以采取稍微不同的方法:如果您的“无限循环”是通过运行一次迭代的函数发生的,然后使用setTimeout 回调在一段时间后再次调用自身,那么它将“连续”运行,而仍然是可中断的(例如,通过在 doIt 函数中设置一些全局标志变量,generation 可以检查它何时被调用,如果为真则退出。

【讨论】:

  • 那么,我的教授给了我们错误的代码……太棒了!哈哈,谢谢大家有见地的回答!我喜欢这个网站!
  • 如果generation() 是通过onClick 激活的,你会怎么做。我不确定是否可以通过 onClick 调用 clearTimeout,这是我的教授所期望的。
  • 不需要清除超时时间;只需在 doIt (var continue = false;) 中设置一个全局变量,然后在 generation() 的顶部输入 if (!continue) return; - 下次调用 generation 时,它会退出,并且不会设置另一个自己的超时回调。
【解决方案2】:

我想你想看看this article 关于时间延迟的信息。每当 JavaScript 忙于计算时(包括generate()),它对按钮按下等都没有响应。你想限制这种情况发生的程度。

【讨论】:

  • 那篇文章非常有帮助!但是,我可以不使用 window 方法,而是将此 setTimeout 附加到 onClick 吗?
  • @JoeOzz 您可以在标准代码中执行的任何操作都可以在 onClick 回调中执行
【解决方案3】:

JavaScript 不是多线程的,你不能轻易跳出无限循环。大多数浏览器/JavaScript 会检测到失控的旋转并终止执行。

如果您正在编写游戏引擎,更好地利用 CPU 周期是设置计时器。这样您就可以在不再需要时停止计时器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多