2012-03-22 15 views
17

非常に頻繁に、自分自身がコールバック関数を使用していることがわかりましたが、ドキュメントを手元に置いていないので、渡すことになっているすべての引数そのコールバック関数コールバック関数のすべての引数を取得する方法

// callback is a function that I don't know the args for... 
// and lets say it was defined to be used like: callback(name, number, value) 
something.doSomething(callback); 

どのようにそれに渡すargsを決定することができますか?

注:コード自体が難読化と縮小されたとき役に立たないことができるソースコードを見て(フレームワークは、多くのJSなど)

+4

'arguments' http://javascriptweblog.wordpress.com/2011/01/18/javascripts-arguments-object-and-beyond/ – asawyer

+1

パラメータは呼び出し元ではなく、呼び出し先で定義する必要がありますか? – jbabey

+0

ドキュメントを手元に置いていなくても、呼び出し元関数のソースコードをよく見ることができます。 – hugomg

答えて

26

var original = callback; 
callback = function() { 
    // Do something with arguments: 
    console.log(arguments); 
    return original.apply(this, arguments); 
}; 
  1. コンテキストは、thisは保持されます。
  2. すべての引数が正しく渡されます。
  3. 戻り値は正しく渡されます。

注:この方法はほとんどの場合有効です。ゲッター/セッターでない場合、

  • 読み取り専用のプロパティ(例えばwritable:falseObject.definePropertyを使用して定義)
  • ゲッター/セッターを使用して定義されているプロパティを:このメソッドは含めて、失敗しますエッジケースがありますが対称。
  • ホストオブジェクトとプラグインAPI:例: FlashとActiveX。
+1

PS。さらに詳しい情報については、置き換えられたコールバック関数に[console.trace();](https://developer.mozilla.org/en/DOM/console.trace)を追加してください。 –

+1

なぜ 'return original.apply(this、arguments);'で十分ではありませんか? – gdoron

+0

@gdoron '.apply() 'が使用されている場合、一部のブラウザでエラーが発生します。参照:[MDN: 'Function.apply'](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Function/apply#Parameters)。 ['arguments'](https://developer.mozilla.org/ja/JavaScript/Reference/Functions_and_function_scope/arguments)オブジェクトは真の配列ではありません。 –

8

それができるように簡単

function callback() { 
    console.log(arguments); 
} 

として?

すべての関数は、automagic argumentsコレクションで呼び出された引数を提供します。このように、コールバック関数を上書きし、機能性を壊すことなく、引数のリストを取得するには

+0

彼はコールバックコードを変更することはできません。彼ができるなら、彼はそれが何であるかを知るために議論を使う必要はないでしょう... – gdoron

+0

彼はそれをどこで言ったのですか?いつからJSコードを変更できないのですか?それとは別に、数回のクリックでJSデバッガとブレークポイントが実現します。 – Tomalak

+0

彼はfuncのドキュメンテーションを見たくないと書いていますので、確かに彼はその機能コードを手には持っていません。 – gdoron

1

馬を導いているカートではありませんか?

関数はコールバックを受け取ります。 関数を使ってコールバックが受け入れるべき引数を知っておく必要があります。

+3

それは* my *関数であれば真となりますが、イタリックをうまく使うと+1になります。ハハ;) – Kristian

0

あなたも、[functionNameを] .arguments使用して取得するためにどの関数の引数にそれを伝えることができます。def「argumentsX」で見られるような引数は(ところで、そのスコープのようにキーワードを書き換えて

(function(arg1, arg2, agr3){ 
    console.log('args are:', arguments); 
    return function fn(){ 
     function m(){ 
      console.log(
       'fn.arguments:', fn.arguments, 
       'm.arguments:', m.arguments, 
       'argumentsX:', arguments 
      ); 
     }; 
     m('mArg1', 'mArg2', 'mArg3', 'mArg4'); 
    }; 
}) 
(1, 2, Math.PI) // invoke closure 
('fnArg1', 'fnArg2', 'fnArg3', 'fnArg4'); // invoke "fn" 

すべての機能をログ)。

関連する問題