TL; DR:Array.prototypeおよびFunction.prototypeに組み込み関数を追加すると、IE8のネイティブJSONパーサーがJSONを解析する際にスタックオーバーフローを引き起こします。 JSON.parse()にリバーブ関数を渡した場合にのみ、配列が含まれます。IE8のネイティブJSON.parseのバグでスタックオーバーフローが発生する
これは質問から始まりましたが、自分のオリジナルの質問に答えましたので、私は質問します:このIE8バグの回避策は誰でも、修正するすべてのJSライブラリArray.prototypeとFunction.prototype?
オリジナル質問:
は、私は約13K JSONデータの解析する必要があります。データの構造は、ネストされた配列である単一の値を持つオブジェクトです。
{ 'value':[[ stuff ], [ more stuff], [ etc ]] }
私はjson2.jsを使用しています。利用可能な場合は、ブラウザのネイティブJSON.parseを使用しています。リバース機能をJSON.parseに渡して、日付を適切に処理しています。 IE8がIE7エミュレーションモード(スクリプトベースのjson2.jsパーサーを使用するようになります)では、すべて正常に動作します。 IE8がIE8モード(ブラウザ固有のJSONパーサーを使用する)になると、「スタック領域外」というエラーが発生します。 FirefoxとChromeはもちろん、ブラウザ固有のJSONパーサーでうまく動作します。
これまでに絞り込んだことは、何もしないリバイバー関数をJSON.parseに渡すと、IE8のネイティブパーサーがスタックオーバーフローを取得することです。リバース機能を渡さないと、IE8のネイティブ・パーサーは正常に動作しますが、日付の解析は正しく行われません。
// no error:
JSON.parse(stuff);
// "out of stack space" error:
JSON.parse(stuff, function(key, val) { return val; });
私は以下のデータまたはデータの少ないネスティングがエラーを避けることができるかどうかを確認するために、私のJSONデータを再生するために行くんだけど、誰もが前にこれを見ていた、または任意の他の提案した場合、私は思っていました回避策。 IE8の速度はまだ十分ですが、このバグのためにそのブラウザのネイティブJSONを無効にすることは残念です。
更新:別のJSONデータを使用すると、IE8のネイティブパーサーをリバース機能で使用すると「$ lineinfo is undefined」というjavascriptエラーが発生します。リバース機能を使用しないとエラーは発生しません。文字列 "$ lineinfo"は私のソースコードのどこにも表示されません。
更新2:実際、この問題はプロトタイプ1.6.0.3によって発生しているようです。プロトタイプライブラリに追加するまで、孤立したテストページで再現できませんでした。
UPDATE 3:
prototype.jsのは、IE8ネイティブJSONパーサーはこれです壊す理由:Array.prototypeをする任意の非組み込み関数を追加し、Function.prototypeはIE8ネイティブJSONパーサーを取得させますリバンバ関数をJSON.parse()に渡した場合にのみ、配列を含むJSONを解析する際にスタックオーバーフローが発生します。
Prototypeライブラリは、Array.prototypeとFunction.prototypeの両方に関数を追加しますが、これは同じことを行う他のライブラリにも等しく適用されます。 IE JSONパーサーのこのバグは、PrototypeとExtでは公開されていますが、jQueryでは公開されていません。私は他のフレームワークをテストしていません。
ここでは、完全に独立して問題を再現しています。 Function.prototype行またはArray.prototype行を削除するか、配列をJSON文字列から削除すると、「スタック領域外」エラーは発生しません。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
Function.prototype.test1 = function() { };
Array.prototype.test2 = function() { };
window.onload = function()
{
alert(JSON.parse('{ "foo": [1,2,3] }', function(k,v) { return v; }));
}
</script>
</head>
<body>
</body>
</html>
JavaScriptチームは、これがJavaScriptエンジンの既知の問題であると報告しています。ありがとう。 – EricLaw
私にお知らせいただきありがとうございます。 –