JavaScript简单for循环导致的无限循环

3

由于这段代码的存在,我陷入了一个无限循环中。如果在循环之前声明变量i并赋值(例如 var i = 0),问题会得到解决,但我不确定原因。熟悉JavaScript细节的人能否向我解释一下这里发生了什么?

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

1
这里没有无限循环。只打印一次“hi”(Chrome 19.0.1084.52 m)。 - KooiInc
看起来对我来说运行良好。不要有无限循环! - Clyde Lobo
1
你在发布之前简化了这个例子吗?给出的代码(没有上下文)可以正常运行。 - diolemo
2
也许在循环的实际主体中声明了其他地方并进行了修改? - wnrph
我已经找出了问题所在,它不是在for循环本身内部的无限循环,而是函数本身被无限调用。这是因为我的函数在一个使用变量i的for循环中被调用,而我的函数内部的for循环一直修改该值,导致调用我的函数的for循环永远无法退出。 - Vadoff
3个回答

5

由于 i 没有被声明为本地变量,因此您的代码实际上会改变变量/对象 window.iwindow.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 的值,以查看在更改这些变量之前它们包含什么内容。我想知道为什么它卡住了。 - Kayo
顺便问一下,它是进入无限循环还是抛出错误并停止执行。查看控制台错误或仅逐步执行代码。 - Kayo
我已经找出了问题所在,它不是在for循环本身内部的无限循环,而是函数本身被无限调用。这是因为我的函数在一个使用变量i的for循环中被调用,而我的函数内部的for循环一直修改该值,导致调用我的函数的for循环永远无法退出。 - Vadoff
它将会无限循环,其值如下:外部:num=0 --> 内部: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 - Vadoff

2
代码看起来很好,在jsFiddle上可以看到它的运行效果,点击这里
另外需要注意的是,JavaScript中的变量要小心处理。你应该始终使用var来声明变量,如果你忘了,它们会成为全局变量!

1

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

如果您在未声明变量的情况下访问i,则表示您将其用作全局变量而不是本地变量。请仔细分析您的代码,查找任何混乱您循环的全局“i”或“num”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接