2011-12-05 9 views
7

javascriptを使用してJavaScriptで実行されているすべての関数のスタックの深さを判断する方法はありますか?JavaScriptを使用してJavaScriptのスタックの深さを判断する

Functionプロトタイプを変更することが考えられると思いますが、実際には何も考えていません。

さらに、スタックの深さが十分に高い場合はいつでも破損することができればいいと思います。

この理由は、stack overflow error in IE which is apparently not debuggableです。私は怠け者であり、原因を見つけるために維持しているコードを捜す必要はありません。

私の怠惰を助けてくれてありがとう。

+0

ブラウザ自体がスタックオーバーフローエラーをスローするまで、ある関数に別の関数を伝え、グローバル変数をインクリメントすることができます。次に、カウンター変数を印刷すると、スタックの深さの粗値が得られます。 – Bojangles

答えて

5

ECMAスクリプトは、かなりの間、Function.prototype.callerプロパティに対応しています。たとえそのES5で厳格に廃止されたとしても、IEはそれをサポートしなければなりません。だから、基本的には関与している機能をループすることができます。出力されます

function one() { 
    two(); 
} 

function two() { 
    three(); 
} 

function three() { 
    var caller = three.caller; 

    console.log('caller was: ', caller.name); 

    while(caller = caller.caller) { 
      console.log('caller was: ', caller.name); 
    } 
} 

(function outer() { 
    one(); 
}()); 

:あなたが知っているのであれば

caller was: two 
caller was: one 
caller was: _outer 

、エラーを機能させるには、あなたが答えに、このメソッドが最初に呼び出されたかをすべての方法までを取得し、そのように起こります。深さのちょうど後になっている場合は、caller.callerプロパティを超えた回数をカウントすることができます。少なくともIE8は "デバッガ"ステートメントをサポートする必要があります。このステートメントは、そのスクリプトで呼び出して、デバッガをステージ上に持ってくることができます。

+0

これは私がやっているようなものですが、コードに追加することなく、これを何らかの方法ですべての関数に適用する必要があります。分かりますか?ありがとう。 – user420667

+1

@ user420667:Function.prototypeよりも簡単な方法はないと思います。基本的には、すべてのオブジェクト( 'window'で始まる)に対して再帰的ループを行い、関数をチェックする必要があります。見つかった場合は、メソッドをフック/パッチして上記のコードを呼び出す必要があります。うまくいくかもしれない。 – jAndy

+0

ああ、そうですね。各関数のようなものです... newFunction = function(){oldFunction(args); if(CallerDepth()> MaxAllowedDepth){デバッガ;}}; oldFunction = newFunction; ???私はそれほど正しいとは思わない。また、あなたが言ったように、何らかの他の関数の前に何とか呼び出されていることを確認し、関数を変更する前に反復する関数のリストが作成されていることを確認します。 – user420667

4
function stackDepth() { 
    var c=stackDepth.caller, depth=0; 
    while (c) { c = c.caller; depth++; } 
    return depth; 
} 

Chromeは、コンソールから、スタックの深さが、すでに3である、ので、多分それぞれのJavaScript環境のために、あなたが最初のベースラインの深さを決定し、そこから減算する必要があるだろうと考えているようです。

+0

興味深いです。私は3つのより高いレベルのオブジェクトが何であるのだろうか。窓?資料? – user420667

関連する問題