为什么 JS Bin 告诉我潜在的无限循环?
Why does JS Bin tell me potential infinite loop?
对于此代码:
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 坚持认为这可能是一个无限循环,随后会终止。
我不知道这是否是 JS Bin 检测到的,但那里可能存在无限循环。
变量i没有声明,所以默认是一个全局变量。循环体调用一个函数,该函数可以更改 i 的值(例如 i = 0;
),使其永远不会到达终点,因此循环将是无限的。
或者,i 可以定义为常量 (const i;
),这将防止值发生变化,再次使其成为无限循环。
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;
};
对于此代码:
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 坚持认为这可能是一个无限循环,随后会终止。
我不知道这是否是 JS Bin 检测到的,但那里可能存在无限循环。
变量i没有声明,所以默认是一个全局变量。循环体调用一个函数,该函数可以更改 i 的值(例如 i = 0;
),使其永远不会到达终点,因此循环将是无限的。
或者,i 可以定义为常量 (const i;
),这将防止值发生变化,再次使其成为无限循环。
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;
};