未知の異常:Maximumcal stack size exceeded
1645 ワード
一、問題:
今日はホームページを作っている時に突然このようなJavaScriptエラーに出会いました.
Uncaght RangeError:Maximum call stack size exceeded
思いもよらないで、千回のデバッグは原因が見つけられません.
表面的には再帰回数が多すぎてメモリが消費されすぎていますが、私のプログラムには再帰アルゴリズムがありません.
二、原因:
最終的に冷静に長い間考えましたが、問題の根源はホームページで二つの異なるjavascriptライブラリを引用したことにあります.この二つのライブラリはいずれもJavaScript元のオブジェクトのいくつかの方法に対して修正を行い、循環参照ができました.具体的には、こういうことです.
ホームページHはjsライブラリAとBを引用していますが、AとBはMath.powの方法を修正しました.
Math.pow()メソッドの修正が一回しか行われていないなら、問題はないです.Math.PowerでMath.powのオリジナルバージョンを保存してから、新しいコードでMath.powを交換します.しかし、第二のライブラリでは、Math.power=Math.powまで実行すると、Math.powerはMath.powのオリジナルバージョンを保存するのではなく、Math.powはすでに最初のライブラリから新しいコードに変更されていますので、Math.powの新しいコードでMath.powerを呼び出したときは、元のバージョンの呼び出しを意図しましたが、実際には自分で呼び出しました.そこで循環をもたらしました!
三、解決案:
置換を行う前に判断コードを1行追加し、同じ方法名を重複しないようにします.
すなわち
?
1
2
3
4
5
6
7
8
9
10
11
12
13
今日はホームページを作っている時に突然このようなJavaScriptエラーに出会いました.
Uncaght RangeError:Maximum call stack size exceeded
思いもよらないで、千回のデバッグは原因が見つけられません.
表面的には再帰回数が多すぎてメモリが消費されすぎていますが、私のプログラムには再帰アルゴリズムがありません.
二、原因:
最終的に冷静に長い間考えましたが、問題の根源はホームページで二つの異なるjavascriptライブラリを引用したことにあります.この二つのライブラリはいずれもJavaScript元のオブジェクトのいくつかの方法に対して修正を行い、循環参照ができました.具体的には、こういうことです.
ホームページHはjsライブラリAとBを引用していますが、AとBはMath.powの方法を修正しました.
Math.pow()メソッドの修正が一回しか行われていないなら、問題はないです.Math.PowerでMath.powのオリジナルバージョンを保存してから、新しいコードでMath.powを交換します.しかし、第二のライブラリでは、Math.power=Math.powまで実行すると、Math.powerはMath.powのオリジナルバージョンを保存するのではなく、Math.powはすでに最初のライブラリから新しいコードに変更されていますので、Math.powの新しいコードでMath.powerを呼び出したときは、元のバージョンの呼び出しを意図しましたが、実際には自分で呼び出しました.そこで循環をもたらしました!
三、解決案:
置換を行う前に判断コードを1行追加し、同じ方法名を重複しないようにします.
すなわち
?
1
2
3
4
5
6
7
8
9
10
11
12
13
if
(Math.power ==
null
) {
// , Math.power , , ,
// Uncaught RangeError: Maximum call stack size exceeded
Math.power = Math.pow;
Math.pow =
function
(x, y) {
if
(x != 0) {
return
Math.pow(x, y);
}
else
{
return
0;
}
}
}
// end if