在Internet Explorer 11中加载大型数组会导致堆栈溢出

7

我有一个包含非常大的不规则数组的页面(已生成)。在IE11中,它无法初始化:会出现 SCRIPT28: Out of stack spaceSCRIPT2343: Stack overflow at line: 1 的错误。我已经将出问题的页面减少到最小并加入随机数据,如下所示:

<html><body>
    <div id="info">
        Loading...
    </div>
    <script>

        var d = [];
        var i = 0;

        d[i++] = [
        "XHC_14",
        0
        ];

        d[i++] = [
        "ZXS_26",
        "UVT_27",
        "QML_3149",
        "MJO_3150",
        15993327
        ];

        d[i++] = [
        "VKG_3156",
        "ZEA_3157",
        "KZG_3159",
        "MNA_3162",
        "AKX_3163",
        "KLK_3164",
        618601
        ];

        // more array initialization ...

        info.innerHTML = "<h1>Ready!</h1>"; // this will only show if the initialization succeeded
    </script>
</body></html>

真实文件有大约500k行,重复了大约14k次数组初始化。真实文件可在此处下载:ie11_stack_overflow_problem.zip 只有当数组初始化足够大时才会崩溃。我尝试了各种变化,包括将其放在函数中以给它自己的作用域,但都没有成功。我测试了所有其他浏览器,包括XP上的IE8都可以正常工作。我的配置是Win7和IE 11.0.9600.17107(完全更新)。
有人能想出为什么会发生这种情况吗?

1
我认为这不是运行时问题。我认为您已经达到了编译器/解释器的某些限制。那是一个相当庞大的源文件。我可能会考虑将这些数据外部化,并尝试通过XMLHttpRequest进行加载。 - spender
我不能这样做,因为文件的目的是自包含的(它是由一个实用程序生成基于HTML的文件列表)。 - rlv-dan
我应该补充一下:锯齿数组似乎是问题的一部分。如果你只取一个dir[i ++]并将其乘以相同的大小,那么这种情况就不会发生。 - rlv-dan
1个回答

4

那个文件太可怕了,它会让 Visual Studio、Notepad++ 以及 IE11 崩溃。你已经炸掉了解释器。

我通过使用

成功解决了这个问题。

JSON.serialize(d)

在另一个浏览器中运行代码,然后将输出作为字符串粘贴到源文件中。

然后:
var jsonStr = '[[blablabla...I go on foreeeeeever]]';
var d=JSON.parse(jsonStr);

现在它能在IE11中加载。

因此解决方案是将您的数据结构写成JSON字符串并进行解析。


有趣的解决方法。虽然它并没有回答导致崩溃的原因是什么。我想知道这是否是IE11中的一个错误? - rlv-dan
4
我认为很明显了。你的代码由于内存(堆栈空间)耗尽而导致解释器崩溃。这是否算作一个错误或者一个设计特性还有争议(我想,任何一个溢出的堆栈在设计时都可能受到大小的限制)。内存不足是个bug吗?Visual Studio和Notepad ++是否都有同样的bug?如果你施加足够大的压力,所有浏览器都会有限制。我认为你的文件属于相当大的压力。 - spender
5
“我们总是知道IE有点糟糕。” - spender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接