【问题标题】:Why am I getting an infinite loop error inp5.js?为什么我在 p5.js 中收到无限循环错误?
【发布时间】:2019-03-23 02:00:28
【问题描述】:

通过一个简单的 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 中的阈值已增加到 500 毫秒

至少对我来说令人惊讶的是,如果我删除任何分号,则在 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 网络编辑器的无限循环检测?

【问题讨论】:

  • 哪个编辑器警告你无限循环?
  • p5.js 在线编辑器
  • 我在 P5.js 编辑器中看不到任何警告。当我运行您的代码时,我看到一个黑色矩形。
  • 我重新运行了代码,但仍然失败。我screengrabbed编辑器,所以你可以看到错误。如果你的没有出现,那是不是我的电脑有问题?
  • 我真的不确定。假设它应该创建一个黑色矩形,您的代码看起来不错,并且对我来说工作正常。我想如果您的计算机速度极慢,可能会导致此错误,但我认为 400x400 嵌套循环不会导致任何问题。如果您测量时间(使用millis() 函数),您的setup() 函数需要多长时间?

标签: javascript infinite-loop p5.js


【解决方案1】:

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

网页编辑器用来检测无限循环的逻辑非常简单,如果循环执行for more than 500ms 就会抛出异常。此异常可能会令人困惑,因为在此消息引发异常时,循环可能已经快要完成了:

退出潜在的无限循环

潜力这个词对于理解信息很重要。这行代码会触发异常:

while(true);

但任何执行超过 500 毫秒的有限循环也会触发该消息。

如果我们知道循环不是无限的,并且我们也知道它可能需要超过 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 网络编辑器无法检测到该循环。此循环将一直运行,直到浏览器检测到它并提示用户停止或等待。

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

总结

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

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 2021-10-17
    • 2015-11-14
    • 2013-02-06
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    相关资源
    最近更新 更多