2014-05-19 63 views
7

我有一個(生成的)頁面,上面有一個非常大的鋸齒狀數組。它不會在IE11中初始化;我得到SCRIPT28: Out of stack spaceSCRIPT2343: Stack overflow at line: 1。我有問題的頁面已經減少到最低限度,用隨機的數據,這是它的樣子:在Internet Explorer 11中加載巨大的數組會導致堆棧溢出

<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

+0

我不能,因爲文件的要點是自包含的(它是由[工具](http://www.rlvision.com/snap2html/)生成的基於html的文件列表) –

+0

我應該添加這:鋸齒陣列似乎是問題的一部分。如果你只是選擇一個dir [i ++]並乘以相同的大小,它就不會發生。 –

回答

4

該文件是可怕的,是對Visual Studio和記事本++ ......甚至IE11的死亡之吻。你已經炸燬了口譯員。

我得到這個在其他瀏覽器中使用

JSON.serialize(d) 

,然後粘貼輸出作爲一個字符串到源文件的工作。

然後:

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

現在它加載在IE11。

所以解決的辦法是把你的數據結構寫成一個JSON字符串並解析它。

+0

有趣的解決方法。雖然它沒有給出導致崩潰的原因的答案。我不知道它是否是IE11中的錯誤? –

+2

我認爲這很清楚。你的代碼因爲內存不足(堆棧空間)而炸燬解釋器。這是否有資格作爲錯誤或設計特徵是值得商榷的(我認爲無論哪種堆棧溢出都可能受到設計的限制)。內存不足是一個錯誤? Visual Studio和Notepad ++都有相同的錯誤嗎?如果你足夠努力,所有瀏覽器都會有限制。我認爲你的文件是非常努力的。 – spender

+2

(...我們總是知道IE瀏覽器有點垃圾......)。 – spender