未知の異常: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
13if  (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