2011-03-14 15 views
0

私は、関数が参照渡しされるいくつかのJSに取り組んでいます。そして、いつどの関数が呼び出されているのかを知ることは難しいです。それは、それぞれ7トンから8つの関数をパラメータのトンで渡すので、どこから来たのかを追跡するのは非常に時間がかかります。私はこのビットを変更するに取り組んでいますが、私はその機能を確認するために把握することができた唯一の方法は、実際にはこのような何かをすることで呼び出されている:javascriptでどの関数が参照されているかはどのように把握できますか?

 if (console && console.log && method.toSource) { 
      console.log(method.toSource()); 
     } 

これだけの作品にFFであるが、少なくとも私は呼び出された関数のソースを検索することができる。より良い方法がありますか?

+0

なぜ、どの関数が渡されたのか知っておく必要がありますか?パラメータのために?私にはあなたのデザインを変えなければならないようです。片側に柔軟性がありますが、あなたがどの具体的なインスタンスを扱っているかを知る必要はありません。文脈についてもっと詳しく説明できますか?それとも、デバッグ用ですか? –

+1

私が 'console.log(myFunction)'を実行してコンソールの出力をクリックすると、Scriptタブの関数にまっすぐジャンプします。 – nickf

+0

@felixここに例があります。アイテムのリストからアイテムを選択すると問題が発生します。アイテムが選択されたときに呼び出される関数を見つけてそこで何が起こっているのかを確認する必要があります。それはちょうどonclick()のように見えます。 Obv私はそのメソッドが設定されている場所を見つけることができますが、それ自体が渡された関数かもしれないので、時には時間がかかることがあります。コードベースは大規模なものなので、手作業で調べるのではなく、迅速に自動で見つけ出す必要があります。 – Shawn

答えて

1

この

var whee = { 
    test: function(ab) { 
     console.log(ab); 
     this.test2('Hello', 'World'); 
    }, 

    test2: function(a, b) { 
     console.log(a+' '+b); 
    } 
}; 

function augment(obj, withFn) { 
    var name, fn; 
    for (name in obj) { 
     fn = obj[name]; 
     if (typeof fn === 'function') { 
      obj[name] = (function(name, fn) { 
       var args = arguments; 
       return function() { 
        withFn.apply(this, args); 
        fn.apply(this, arguments); 
       } 
      })(name, fn); 
     } 
    } 
} 

augment(whee, function(name, fn) { 
    console.log("calling " + name); 
}); 

whee.test('hi'); 

機能の増強は、第一パラメータと第二のような関数としてOBJを取るしてください。関数を探しているオブジェクトのすべてのメンバーをループします。 1つが見つかると、渡された関数と元の関数を呼び出す関数に置き換えられます。私はこのstackoverflow answerのコードのほとんどすべてを盗んだ。

ウィンドウオブジェクトに渡したときにうまく動作しないように思われるので、関数がすべてウィンドウスコープで宣言されていないことを願っています。

answerもあり、Function.prototype.call関数を独自の関数でオーバーライドしようとしています。私はそれをFirefoxで動作させることができませんでしたが、おそらくあなたはより良い運を持っています。

+0

彼はすでに彼がどのような機能を持っているかという2つのアイデアがある場合にのみ機能します。 –

+0

このアプリには15000行のjsがあります。 – Shawn

+0

firebugのように、通話記録タブがあります。私はそれを使用したことはありませんが、あなたのために働くかもしれません。 http://getfirebug.com/javascript –

1


をクリック放火犯に右側のパネルのスタックタブで
リロードページ
クリックを有効にするスクリプト]タブの右下の
クリックでバグのアイコンを放火魔アドオンインストール
クリックしてFirefoxの
をインストール

1

Firebugでconsole.trace()を試しましたか?

function whichFunc(func, funcDict) { 
    for (var funcname in funcDict) { 
     if (func == funcDict[funcname]) { 
      return funcname; 
     } 
    } 
} 

var whee = { 
    test: function(ab) { 
     console.log(ab); 
     this.test2('Hello', 'World'); 
    }, 

    test2: function(a, b) { 
     console.log(a+' '+b); 
    } 
}; 

その後、あなただけのそれぞれであなたの今の匿名の参照を比較することができます:あなたはアレックス・ブラウンの答えのように辞書を持っているので、もし

1

関数は、参照することにより比較することができますものすごく単純。

関連する問題