为什么在inp5.js中出现无限循环错误?

时间:2019-03-23 02:00:28

标签: javascript infinite-loop p5.js

使用简单的for循环,我可以在p5.js web editor

中触发潜在的无限循环异常
function setup() {
  var cnt = 0;
  var startTime = new Date().getTime();
  for (i = 0; i < 80000; i++) {
    console.log(cnt++);
  }
  var endTime = new Date().getTime();
  console.log("done in " + (endTime - startTime) + " milliseconds");
}

给我输出:

  

在第5行退出潜在的无限循环。要禁用循环保护,请执行以下操作:在代码中添加“ // noprotect”   在501毫秒内完成

这并不奇怪,因为我发现p5.js-web-editor issues 174中的阈值已增加到500ms

至少对我而言,令人惊讶的是,如果我删除任何分号,则在500毫秒后我的循环完成后,可能不会检测到潜在的无限循环。

例如:

function setup() {
  var cnt = 0 // no semicolon here..
  var startTime = new Date().getTime();
  for (i = 0; i < 80000; i++) {
    console.log(cnt++);
  }
  var endTime = new Date().getTime();
  console.log("done in " + (endTime - startTime) + " milliseconds");
}

给我输出:

  

79999

     

在1737毫秒内完成

我的问题是,为什么删除分号会破坏p5.js Web编辑器的无限循环检测?

1 个答案:

答案 0 :(得分:0)

p5.js web editor在检测到正在运行的草图中可能是无限循环时会引发异常。

Web编辑器用于检测无限循环的逻辑非常简单,如果循环执行for more than 500ms,则会引发异常。此异常可能会引起混淆,因为在此消息引发异常时,循环几乎已经准备好完成:

  

存在潜在的无限循环

潜力一词对于理解消息很重要。这行代码将触发异常:

while(true);

但是任何执行时间超过500ms的有限循环也会触发该消息。

如果我们知道一个循环不是无限的,并且还知道可能要花费500毫秒以上的时间才能完成,我们可以添加一个noprotect注释来禁用无限循环保护:

var cnt = 0;
// noprotect
while(cnt < 80000)console.log(cnt++);

该代码将记录0到79999之间的数字。在添加noprotect注释之前,请确保并仔细检查该代码。一个小错误可以将有限循环变成无限循环:

var cnt = 0;
// noprotect
while(cnt < 80000)console.log(cnt);

通过忘记增加cnt,我们创建了一个无限循环,p5.js Web编辑器将不会检测到该循环。该循环将一直运行,直到浏览器检测到它并提示用户停止它或等待。

问题的最后一部分问为什么在行尾删除分号会更改循环保护行为。一个简单的答案是编辑器必须添加工具以提供检测。缺少分号会导致编辑器无法正确检测代码。最好用分号结束javascript语句。查看Do you recommend using semicolons after every statement in javascript

的答案

摘要

  • p5.js Web编辑器可以帮助您避免长时间运行的循环
  • 使用noprotect注释进行故意的长时间运行循环
  • 使用分号结束javascript语句