我在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”警报的原因?
答案 0 :(得分:7)
x
和y
是函数的所有递归调用共享的全局变量。如果您希望它们是本地的,请使用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声明为局部变量,您可以克服这个问题。这样,您可以通过每个函数调用获得它们的新表示,而不是覆盖它们。