【问题标题】:Unexpected infinite loop意外的无限循环
【发布时间】:2013-12-16 19:57:07
【问题描述】:

这段代码无限运行,为什么?

    function f(n){
        i=0;
        if (n==2){
            while(i<2){
                f(i);
                i++;
            }
        }
    }

如果 n!=2 函数应该什么都不做 如果 n 等于 2 函数调用 f(0) 和 f(1) 所以它应该在那之后停止 但是运行时只会出现无限循环。

有人能说出原因吗?

编辑:函数之外没有任何东西。

并且不需要更好的代码。只是问为什么。

【问题讨论】:

  • 因为i 是全球性的?
  • 因为每次调用 f 时,它都使用 same i 值。每次,i 都被重新设置为0,所以它一直在循环。在第一次调用 f(2) 时,您永远不会跳出 @9​​87654327@ 循环。
  • 如果这是您尝试理解 JS 作用域的方式,请尝试从一个更简单的示例开始。
  • "var is not optional" 我认为这会是一个很棒的歌名。
  • 在 JavaScript 中,如果你不使用 var 声明变量,它会创建一个隐式全局变量。如果你使用var,它的作用域就是声明它的函数。

标签: javascript infinite-loop


【解决方案1】:

你可以通过改变来修复它

i=0;

var i=0;

您的i 变量是全局变量(或者至少它的作用域在f 之外,因此它由函数的所有调用共享)。当n 最初是2 时,您进入循环并且该循环总是在增量之前将i 重置为0。因此,您拥有的序列是

i = 0 // start of f
// enters loop for the first time with f(0)
i = 0 // start of f
i = 1 // i++
i <2 so loop again
i = 0 // start of f
i = 1 // i++
i <2 so loop again
i = 0 // start of f
i = 1 // i++
i <2 so loop again
i = 0 // start of f
i = 1 // i++
i <2 so loop again
i = 0 // start of f
i = 1 // i++
...

【讨论】:

  • 每次调用f,全局的i(因为前面没有var)“重置”为0
  • 在我看来,如果 f 曾经被 2 调用过,它仍然是无限的,但出于不同的原因。
  • 哦,我猜不是。条件为&lt; 2
  • 我不明白为什么i 是全局的,即使它在f 之外不存在
  • @MIE 如果您不使用var 声明变量,那么您将重用一个外部变量(如果您从未声明它,则为全局变量)。
【解决方案2】:

i 是全局的。使用var 声明它,而不是将其保留在每个实例的本地。否则,它会不断重置为0,因此您的while 循环永远不会结束。

【讨论】:

    【解决方案3】:

    因为在 i = 0 时你一直得到 f(i)。所以当你做一个循环时,你会无限期地做 f(0) ! (每个 i 都相同)只需在 i 上放一个 var 即可停止循环

    【讨论】:

    • 和?就在你每次得到 f(i) 和 i = 0 之前......看:n = 0 function f(0){ i=0;如果 (n==2){ 而(i
    【解决方案4】:

    你能试试吗,i=0是全局变量,f(i)每次都设置值和全局变量的原因,所以你每次都需要使用var i=0;来初始化i

        function f(n){
            var i=0;
            if (n==2){
                while(i<2){
                    f(i);
                    i++;
                }
            }
        }
    

    【讨论】:

    • 有更好的。问题是为什么?
    【解决方案5】:

    每次调用f() 时,i 都会被设置回0。既然你没有做var i = 0,那就意味着i是全局的!每次调用f() 时,都会使用i相同值。

    当您调用f(2) 时,您将启动while 循环。每次您拨打f(i) 时,您都将i 重新设置为0。所以while 循环永远不会结束。

    您需要将i 设为本地:

    function f(n){
        var i=0;
        if (n==2){
            while(i<2){
                f(i);
                i++;
            }
        }
    }
    

    这样每次调用f() 时,它都会创建自己的i 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      相关资源
      最近更新 更多