【问题标题】:Finite loop crashing browser有限循环崩溃浏览器
【发布时间】:2018-02-23 16:57:39
【问题描述】:

我希望有人能解释我的 for 循环有什么问题。如果我将 for 循环输入为 if(arguments[2]){ stable = rere(stable, arguments[2]);} 它会按预期工作。我可以有超过 6 个参数,并且想了解为什么这个循环不能正常运行。

function sym() {
  function rere(a,b){
    var check = [];
    for(i=a.length-1; i>=0; i--){
      for(x=b.length-1; x>=0; x--){
        if(a[i] == b[x]){
          check.push( a.splice(i,1) );         
        }
      }
    }

    for(i=b.length-1; i>=0; i--){
      for(x=check.length-1; x>=0; x--){
        if(b[i] == check[x][0]){
          b.splice(i,1);
        }
      }
    }
    var stable = a.concat(b);
    return stable;
  }
  var stable = rere(arguments[0], arguments[1]);

//problem is HERE. The for loop repeating rere function crashes repl.it

  for(i=2; i<arguments.length; i++){
    stable = rere(stable, arguments[i]);
   }
//End problem.

  stable = stable.filter(function(a,b,c){
    return b == c.indexOf(a);
   });
  return stable;
}

sym([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3], [5, 3, 9, 8], [1]); 

【问题讨论】:

  • 错误是什么?
  • 所以你想过滤掉重复项?

标签: javascript for-loop arguments


【解决方案1】:

您没有在rere() 中声明它,从而重用了i 变量,因此它在问题循环的每次迭代中都会被重置。

要修复它,请使用 letvarrere() 内正确声明 i

【讨论】:

  • 如果他声明它,它也会被重置。没有?
  • 不仅如此:建议在代码顶部添加 "use strict"; 行以避免此类常见错误。
  • @techjs 不,一切都与范围有关。
  • @bitifet:好点,但我认为如果它在外部函数中声明而不是在内部rere 中声明,则不会被捕获。如果可以完全避免阴影,那就太好了。
  • @DevinElder:“你不懂 js”系列的“Scope and Closures”标题(你要求的是好的资源,而不是简短的 onw ;-))链接:github.com/getify/You-Dont-Know-JS
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多