对于此代码:
var Obj={};
for(i=0;i<=5;i++){
var add = prompt("add stuff in me!");
var last = Obj.length;
Obj.last = "add";
}
console.log(Obj);
JS Bin 坚持认为这可能是一个无限循环,并且它会随后终止。
答案 0 :(得分:2)
JSBin通过将代码注入到次循环的Javascript中来实现无限循环保护(请参阅here,大约两分钟标记)。基本上,如果循环超过预定义的时间,它将使用警告退出并继续代码。
你的问题这里是你在循环中等待用户输入所以,除非用户可以在超时阈值内输入这六个值,否则它会认为循环是无限的。您可以通过将用户输入行更改为:
来验证这一点var add = "x"; // prompt("add stuff in me!");
在JSBin中运行它显示没有问题,因为用户输入不会延迟循环。
对此的修复是将// noprotect
添加到该行以阻止JSBin错误地将其视为无限:
for(var i=0;i<=5;i++){ // noprotect
添加注释:虽然链接视频显示超时约为一秒,但code似乎不同意。它指出阈值只有十分之一秒:
/**
* Injected code in to user's code to **try** to protect against infinite
* loops cropping up in the code, and killing the browser. Returns true
* when the loops has been running for more than 100ms.
*/
loopProtect.protect = function protect(state) {
loopProtect.counters[state.line] = loopProtect.counters[state.line] || {};
var line = loopProtect.counters[state.line];
var now = (new Date()).getTime();
if (state.reset) {
line.time = now;
line.hit = 0;
line.last = 0;
}
line.hit++;
if ((now - line.time) > 100) {//} && line.hit !== line.last+1) {
// We've spent over 100ms on this loop... smells infinite.
loopProtect.hit(state.line);
// Returning true prevents the loop running again
return true;
}
line.last++;
return false;
};
答案 1 :(得分:0)
我不知道这是否是JS Bin正在检测的,但是那里存在潜在的无限循环。
未声明变量 i ,因此它默认为全局变量。循环体调用一个函数,它可以改变 i 的值(例如i = 0;
),使它永远不会到达终点,因此循环将是无限的。
或者,可以将 i 定义为常量(const i;
),这将阻止值更改,再次使其成为无限循环。