为什么 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;
};