【问题标题】:Javascript nested for loop not workingJavascript嵌套for循环不起作用
【发布时间】:2015-06-26 13:17:02
【问题描述】:

这很奇怪,我在 javascript 中遇到了简单的嵌套 for 循环问题。

我的代码是这样的:

var a = 0, b = 2048;
var i = 0, l = 2048;

for(; a < b; a++) {
    for(; i < l; i++) {
        console.log(a, b, i, l);
    }
}

所以,虽然我期待这样的输出 (0..2047), 2048, (0..2047), 2048,但我有这样的输出:0, 2048, 0..2047, 2048 其中第一个变量:a 不只是从 0 迭代到 2047。 重新表述这个概念:当内部循环正确迭代时,外部循环仅在索引 0 处执行一次。

我确定这是一个简单而愚蠢的问题,但我无法真正发现..

评论

感谢大家发现这个问题,我怎么看不到这个问题真是不可思议。我接受了 simon 的回答,因为它对我来说似乎更干净、更优雅:

  • 他没有像for(var i = 0;...) 那样重新初始化变量,而是将其重置
  • 他在 for 语句中而不是在每次迭代后都包含变量 reset
  • 他没有声明变量 var a = 0, i = 0 然后在每个 for 语句中重置它
  • 他使用常规增量
  • 他在 sn-p 的开头声明每个变量,而不是在执行的不同时间声明它们

再次感谢!

【问题讨论】:

  • 它只是因为当我到达 2048 时,外部循环无法再次执行

标签: javascript node.js loops for-loop


【解决方案1】:

每次内部迭代前初始化 i 即可:

var a = 0, b = 2048;
var i, l = 2048;

for(; a < b; a++) {
    for(i = 0; i < l; i++) {
        console.log(a, b, i, l);
    }
}

【讨论】:

    【解决方案2】:

    您没有在a 循环之间将i 重新加载到0。这里修复:

    var a = 0, b = 2048;
    var i = 0, l = 2048;
    
    for(a = 0; a < b; a++) {
        for(i = 0; i < l; i++) {
            console.log(a, b, i, l);
        }
    }
    

    【讨论】:

      【解决方案3】:

      发生这种情况的原因是因为您从未重置 i,因此内循环只会在外循环的第一次迭代期间发生。此后 i 将永远大于 l。

      试试这个:

      var a = 0, b = 2048;
      var i = 0, l = 2048;
      
      for(; a < b; a++) {
          for(; i < l; i++) {
              console.log(a, b, i, l);
          }
          i = 0;
      }
      

      【讨论】:

        【解决方案4】:

        循环是这样的:

        对于 a = 0;当我变成 2048 时重复。 那么对于 a =1,i 是 2048,因此 i 不

        var a = 0, b = 2048;
        
        for(; a < b; a++) {
            var i = 0, l = 2048;
            for(; i < l; i++) {
                console.log(a, b, i, l);
            }
        }
        

        我相信这就是你想要的。

        【讨论】:

          【解决方案5】:

          这是一个范围问题。变量 ai 没有在你的 for 循环范围内定义。 以这种方式定义它们:

          var b = 2048,
              l = 2048;
          
          for(var a = 0; a < b; a = a + 1) {
              for(var i = 0; i < l; i = i + 1) {
                  console.log(a, b, i, l);
              }
          }
          

          edit: squint 是绝对正确的,JavaScript 不使用块作用域,我把它误认为是问题所在。不过,您应该始终考虑在 for 循环的声明中定义递增的变量,以消除混淆/歧义。

          【讨论】:

          • 不是范围问题。您的代码根本不会更改变量范围。唯一的问题是未能在循环中重置 i,您的回答确实解决了这个问题。
          【解决方案6】:

          试一试

          var a = 0, b = 2048;
          var i = 0, l = 2048;
          
          for(; a <= b&&i<=l; a++,i++) {
              console.log(a, b, i, l);
          }

          有两个循环,它 i 永远不会被重置,所以只会被迭代一次,因此结果是 0, 2048, 0..2047, 2048

          【讨论】:

          • 这不会产生预期的输出
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-12-03
          • 2016-10-10
          • 1970-01-01
          • 1970-01-01
          • 2019-01-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多