2010-08-15 158 views
2

我试图写一个递归方法,它可能需要一个array/value作为输入,然后处理输入。JavaScript递归问题

<html> 
    <body> 
    <script> 
     function process(array){ 
     if (array instanceof Array) { 
      for(i=0; i < array.length; i++){ 
      process(array[i]); 
      } 
     } else { 
      document.write(array + "<br />"); 
     } 
     } 

     process([3, 4, 5, [4,1], [5,1,2],[6,1]]); 
    </script> 
    </body> 
</html> 

当我尝试运行这个程序,它似乎会去一个无限循环。为什么?

回答

13

这是因为你的迭代变量的范围“我”,如果你声明它作为局部变量该方法将正常工作。例如:

for(var i=0; i < array.length; i++) 

如果您创建的变量没有“var”关键字,则该变量的范围将为全局(窗口)。

在你的情况下,当调用过程([4,1])发生时,变量i的值是3,那么在调用过程中,变量“i”的值被设置为“0”,然后递增为“ 1“和”2“,那么值[4,1]的处理完成并且控制被返回给调用者。但是由于变量“i”是全局作用域,“i”的值被修改为“2”而不是“3”,因此这会导致主循环再次处理值[4,1]。这导致无限循环。