有人可以解释这个JavaScript之谜吗?

时间:2010-10-07 05:28:49

标签: javascript

我在JavaScript中编写了一个简单的递归函数,遇到了一些非常奇怪的行为。起初我认为这是浏览器中的错误,但我在FireFox,Chrome和IE9中尝试过,它们的行为方式完全相同。

下面的HTML文件在页面加载时运行一个简单的JS函数。该函数是递归的(只调用一次)。本质上,该函数创建一个新的Array对象并返回它。奇怪的是,在函数递归调用自身之后,x和y引用同一个对象,据我所知它不应该发生。此外,如果您在 return x 之前取消注释最后一行,则不会显示警告“x == y”警报。

<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>JavaScript weirdness...</title>
<script type="text/javascript" language="javascript">
    function RecursiveF(n) {
        x = [ n ];

        if (n > 0) {
            y = RecursiveF(n - 1);
            if (x == y)
                alert('x == y');
        }

        //if (n == 0) return [ n ];

        return x;
    }
</script>
</head><body onload="javascript:RecursiveF(1);"></body></html>

此页面中出现“x == y”警报的原因?

3 个答案:

答案 0 :(得分:7)

默认情况下,

xy是函数的所有递归调用共享的全局变量。如果您希望它们是本地的,请使用var关键字声明它们。

答案 1 :(得分:1)

您需要一个本地变量。

var x = [ n ];

答案 2 :(得分:1)

正如之前所说的问题是,x和y不是局部变量而是全局变量。为什么现在会引起冲突?

执行函数时,JavaScript会将x和y拉出到调用函数的函数并在那里声明它们。所以现在x和y在同一范围内。所以在你写的地方:

y = RecursiveF(n - 1)

最终会发生什么,

return x;
执行

,因此x的值将分配给y,从而产生

x == y

你去吧。通过var语句将x和y声明为局部变量,您可以克服这个问题。这样,您可以通过每个函数调用获得它们的新表示,而不是覆盖它们。