为什么JS Bin告诉我潜在的无限循环?

时间:2015-08-21 02:24:10

标签: javascript loops for-loop increment

对于此代码:

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 坚持认为这可能是一个无限循环,并且它会随后终止。

2 个答案:

答案 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;),这将阻止值更改,再次使其成为无限循环。