繁体   English   中英

使用Javascript类函数进行15次递归后的堆栈溢出

[英]Stack Overflow After 15 Recursions with Javascript Class Function

我有以下代码示例来说明我的观点。 当我在Vista上的IE8中加载此文件时,出现错误“第16行的堆栈溢出”

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

为什么会这样呢? 最终,我只是实现了一个Function Que而不是使用递归,但是对我而言这没有任何意义,我想了解原因。

-代码-

<!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>

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

看来您想要...


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

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

            alert('done');

好的,这是我遇到的问题的更多见解。 返回并修复了我认为是我的应用程序存在的问题之后,我仍然遇到了问题。 使我追究此问题的部分是,如果仅重复14次,它将成功完成。

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

其次,我的代码结构如下:

-HTA

-编辑器类

--- DivManagerClass

---- KeyBindingClass

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

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

一切正常,直到我使用了大于14的数值修饰符。

我一直试图用一个小型测试工具重现此问题,但不能。 在基本的测试工具中,我最多可以递归3000。 所以我开始尽我所能重新创建场景。 首先,我将对recurse方法的调用移到了另一个类/方法中。 那限制了我的通话筹码大约为1600(几乎消失了一半)。

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

然后,我将代码移入HTA,这又将调用堆栈减少了一半! 在尽可能地模仿我的代码库之后,我尽可能快地达到了约515的调用栈。

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

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

我仍然可以使用函数队列来解决问题,但我只是想让其他人知道A。我不会将如此简单的问题发布到Stack Overflow,而B.您的调用堆栈限制可能会受到该类的极大影响。围绕函数的结构,即使它们不是传统上认为函数堆栈的单独层次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM