【问题标题】:javascript infinite loop caused by simple for loop由简单的for循环引起的javascript无限循环
【发布时间】:2012-06-03 16:01:12
【问题描述】:

由于这一小段代码,我得到了一个无限循环。如果我在循环之前将 var i 声明为任何值(即 var i = 0),它就会变得固定,我不知道为什么。熟悉javascript错综复杂的人可以向我解释这里发生了什么吗?

for (num = 1; num <= 2; num++) {
    for (i = 1; i < num; i++) {
      console.log("hi");
    }
}

【问题讨论】:

  • 这里没有无限循环。打印一次“hi”(Chrome 19.0.1084.52 m)
  • 对我来说似乎运行良好。没有无限循环!!!
  • 在发帖之前您是否简化了示例?给出的代码(没有上下文)运行良好。
  • 也许有一个 i 在其他地方声明并在你的循环的实际主体中进行了修改?
  • 我已经弄清楚出了什么问题,这不是 for 循环本身的无限循环,而是包含它的函数的无限调用。这是因为我的函数在一个也使用 var i 的 for 循环中被调用,并且我的函数中的 for 循环不断修改该值,因此调用我的函数的 for 循环永远不会退出。

标签: javascript for-loop infinite-loop


【解决方案1】:

由于i 未声明为本地var,因此您的代码实际上是在更改变量/对象window.i 以及window.num

添加var 关键字应该可以解决问题:

for (var num = 1; num <= 2; num++) {
    for (var i = 1; i < num; i++) {
      console.log("hi");
    }
}

这并不能回答为什么程序会进入无限循环的问题。但你只知道挂起的代码是试图改变window.iwindow.num 可能在别处使用。

详细了解 javascript 范围规则

【讨论】:

  • 实际上,了解代码覆盖了哪些全局变量会很有趣。如果可能,使用 firebug 在进入外部 for 循环之前放置断点。然后,使用watch 窗口查看变量inum 的值,以在代码更改它们之前查看它们包含的内容。我想知道为什么它挂了。
  • 顺便说一句,它是进入无限循环还是抛出错误并停止执行。查看控制台错误或单步执行代码。
  • 我已经弄清楚出了什么问题,这不是 for 循环本身的无限循环,而是包含它的函数的无限调用。这是因为我的函数在一个也使用 var i 的 for 循环中被调用,并且我的函数中的 for 循环不断修改该值,因此调用我的函数的 for 循环永远不会退出。
  • 它只是无限循环,值是这样的:outer: num=0 --> inner: i=0, num=1 --> i=1, num=2 -->外部:num=0 --> 内部:i=2,num=1 --> i=1,num=2 --> 外部:num=0 --> 内部:i=2,num=2 --> i=1, num=2 --> 外部: num=0 --> 内部: i=2, num=1 --> i=1, num=2 --> 外部: num=0 --> 内部: i=3, num=1 --> i=1, num=2 --> 外部:num=0
【解决方案2】:

代码似乎还不错,在 jsFiddle here 上查看它的实际效果。

另一个注意事项:注意 javascript 中的变量。您应该始终使用var 来声明它们;如果您忘记了它们最终会成为全局变量!

【讨论】:

    【解决方案3】:

    它不应该是无限的,但这是可能发生的情况。

    您在没有声明 var 的情况下访问 i 意味着您将其用作全局变量而不是本地变量。尝试仔细分析您的代码,以找出任何在您的循环中混乱的全局“i”或“num”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多