0

我有以下代码示例来说明我的观点。当我在 Vista 上的 IE8 中加载它时,我收到错误“Stack Overfow at line:16”

如果我使用顶级函数(在 testClass 对象之外)进行递归,我可以递归数百万次而不会出现堆栈溢出。

为什么会这样?最终我只是实现了一个函数队列而不是使用递归,但对我来说没有意义,我想了解原因。

- 代码 -

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">
<html>
    <head>
        <title>Recusion Test</title>
        <body>
        </body>

        <script type="text/javascript">

            function testClass() {
                this.x = 15;
                this.recurse = function() {
                    this.x--;
                    this.recurse();
                }
            }

            var wtf = new testClass();
                wtf.recurse();

            alert('done');
        </script>
    </head>
</html>
4

2 回答 2

7

您的递归语句没有终止条件,因此它将永远运行。

看来你想要...


            function testClass() {
                this.x = 15;
                this.recurse = function() {
                    if (this.x--)
                        this.recurse();
                }
            }

            var wtf = new testClass();
                wtf.recurse();

            alert('done');
于 2009-10-08T18:38:13.430 回答
1

好的,这里对我遇到的问题有更多的了解。在回去修复我认为是我的应用程序的问题后,我仍然遇到问题。让我追究这个问题的部分是,如果我只递归 14 次,它就会成功完成。

首先,我在 HTA 而不是 Internet Explorer 中执行原始代码。我正在编写一个类似于 FCKEditor 的基于 VIM 的代码编辑器。

二、我的代码结构如下:

-HTA

--EditorClass

---DivManager类

----KeyBindingClass

在我的 KeyBindingClass 中,我有一个类似于提供的示例的代码库(除了它有一个终止条件)

在我的 KeyBindingClass 中,我有一个 repeater 属性,如果按下数字修饰符,它将重复最后一次按键 N 次。对于那些不知道在 vim 的可视模式下按 '3' 和 'x' 键的人,将删除三个字符。

在我使用大于 14 的数字修饰符之前,一切正常。

我一直试图用一个小的测试工具重现这个问题,但不能。我能够在基本测试工具中递归多达 3000 个。所以我开始尽我所能重新创建场景。首先,我将对递归方法的调用移到另一个类/方法中。这将我的调用堆栈限制在 1600 左右(几乎一半的堆栈消失了。)

然后我将 jQuery 添加到组合中,并将对 ParentClass.recurse 方法的调用移动到 document.onready jquery 处理程序内的键绑定事件中。这将我的调用堆栈减少到大约 1300。

然后我将我的代码移动到一个 HTA 中,它再次将我的调用堆栈减半!在尽可能快地模仿我的代码库之后,我达到了大约 515 的调用堆栈。

在做了一些研究之后,我发现 IE 使用可用的内存空间来确定调用堆栈的大小。我猜HTA在这方面要严格一些。考虑到类结构,我还没有弄清楚还有什么其他因素将我的应用程序限制在如此低的调用堆栈中,但问题绝对是代码结构。

我可以将我的基本递归测试放在顶级执行脚本标记中,并在达到堆栈溢出之前获得大约 1473 次调用。

I can still use a function queue to fix my problem, but I just wanted others to know that A. I wouldn't post such a simple problem to Stack Overflow, and B. that your call stack limit can be vastly affected by the class structures surrounding functions, even though they aren't separate levels of what you'd traditionally consider a function stack.

于 2009-10-08T21:25:04.793 回答