这个for循环什么时候逃脱?

时间:2015-01-03 23:21:27

标签: javascript

为了检查我的理解,我们是否只有在for(否则,循环可以转义)时,以下row.length < n循环永远不会转义?

function someFunction (matrix,n) {
  for (var i = 0; i < n; i += 1) {
    var row = matrix[i];
    for (var i = 0; i < row.length; i += 1) {
      if (row[i] < 0) {
        alert("Something's wrong");
      }
    }
  }
}

2 个答案:

答案 0 :(得分:3)

不要在嵌套for循环中使用相同的递增变量!

function someFunction(matrix,n) {
  for (var i = 0; i < n; i += 1) {
    var row = matrix[i];
    for (var i = 0; i < row.length; i += 1) {  //VERY BAD!!!
      if (row[i] < 0) {
        alert("Something's wrong");
      }
    }
  }
}

当内循环完成第一个循环时,我将等于row.length。这也将完成外部循环,再次将i递增1.因此,当外部循环开始其第二次迭代时,您将具有i = row.length + 1。这样做:

function someFunction(matrix,n) {
  for (var i = 0; i < n; i += 1) {
    var row = matrix[i];
    for (var j = 0; j < row.length; j += 1) { //using j instead of i
      if (row[j] < 0) {
        alert("Something's wrong");
      }
    }
  }
}

答案 1 :(得分:2)

对内部和外部循环使用相同的循环计数器i是不好的做法。这只是令人困惑,导致不可预测的行为。

但是既然你已经这样做了,你想知道会发生什么:

当内循环第一次结束时,i的{​​{1}}中的row.length值将为row。然后,matrix将由外循环递增。如果i的新值为i您的>=变量,那么外部循环将立即结束。否则,outerloop将继续使用新值n并执行以下行:

i

如果var row = matrix[i]; 大于或等于imatrix.length变量将为row,那么当你到达内循环并尝试测试undefined您正在测试row.length,这会给您一个错误并停止执行。

但是,如果undefined.length小于或等于i,那么内循环将“运作”,意味着再次使用新值matrix.length和{{1在第一次迭代时设置回row

如果前一行的长度恰好与其索引减去1相同,那么同一行将一直反复处理。

基本上,外部循环的每次迭代都会根据前一行的长度选择一个或多或少随机(可能未定义)的行来继续。