使用简单的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编辑器的无限循环检测?
答案 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
的答案摘要
noprotect
注释进行故意的长时间运行循环