【问题标题】:Can someone explain this JavaScript mystery?有人可以解释这个 JavaScript 的奥秘吗?
【发布时间】:2010-10-07 05:28:48
【问题描述】:

我正在用 JavaScript 编写一个简单的递归函数,但遇到了一些非常奇怪的行为。起初我以为是浏览器的 bug,但我在 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" 警报出现在此页面中的任何提示?

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你需要一个局部变量。

      var x = [ n ];
      

      【讨论】:

        【解决方案3】:

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

        JavaScript 在执行您的函数时所做的是将 x 和 y 提取到调用您的函数并在那里声明它们的函数中。所以现在 x 和 y 在同一个范围内。所以在你写的时候:

        y = RecursiveF(n - 1)
        

        最后会发生什么,那

        return x;
        

        被执行,因此 x 的值将被分配给 y 导致

        x == y
        

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

        【讨论】:

          猜你喜欢
          • 2011-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-14
          相关资源
          最近更新 更多