2015-08-19 42 views
0

昨天,我在递归函数中出现了奇怪的行为,这让我感到沮丧。我设法重现并注意到其他行为。基本上,下面的html/js中的变量似乎是全局的。输出是4,然后是5.我使用FF 40.0.2。截至上周的最新版本的Node.js(ish)发生了同样的问题。我没有注意到它的版本号。在for-statments中声明的变量似乎是全局的

什么给?它应该像这样吗?问题消失我在每个for语句上面声明了循环变量。

<head> 
    <script> 

    function foo(recurse) 
    { 
     if (recurse) 
     { 
     for (i = 0; i < 2; ++i) 
     { 
      foo(false); 
      console.log(i); 
     } 
     } 
     else 
     { 
     for (i = 0; i < 4; ++i) 
     {} 
     } 
    } 

    foo(true); 

    </script> 
</head> 

预期输出:

0 
1 

实际输出:

4 

不清楚该怎么标记这一点。

+0

在JavaScript中,任何未声明的内容都将存储在Global(窗口)对象中。 尝试console.log(window.i),你会知道的。 –

回答

1

好了,问题是,你没有声明他们,所以他们implicitly global。让他们vars

function foo(recurse) { 
    if (recurse) { 
    for (var i = 0; i < 2; ++i) { 
//  ^^^ 
     foo(false); 
     console.log(i); 
    } 
    } else { 
    for (var i = 0; i < 4; ++i) {} 
//  ^^^ 
    } 
} 

foo(true); 

您也可以尝试strict mode,在那里你会得到一个未处理的错误Assignment to unresolved reference in strict mode code: i

+0

我想在'for-loop'之前放置'var i',因为var使用函数作用域,在'for-loop'声明似乎误导了人们''i'只在'for loop'块中可见。 – fuyushimoya

+0

@fuyushimoya:任何js程序员都知道'var'是函数范围的:-) – Bergi