Arguments.callee を使用することで、名前のない無名関数であっても、プログラムによって関数の内部から任意のプロパティを識別できます。したがって、次の簡単なトリックで関数を識別できます。
関数を作成するときはいつでも、後で識別するために使用できるプロパティを割り当てます。
たとえば、常に id というプロパティを作成します。
var fubar = function() {
this.id = "fubar";
//the stuff the function normally does, here
console.log(arguments.callee.id);
}
arguments.callee は関数自体であるため、その関数の任意のプロパティは、上記の id のように、自分で割り当てたものでもアクセスできます。
Callee は公式には非推奨ですが、ほとんどすべてのブラウザーで引き続き機能し、特定の状況ではまだ代替手段がありません。「厳密モード」では使用できません。
もちろん、代わりに、次のように無名関数に名前を付けることもできます。
var fubar = function foobar() {
//the stuff the function normally does, here
console.log(arguments.callee.name);
}
しかし、(この場合) 両方の場所で fubar という名前を付けることはできないため、明らかにエレガントではありません。私は実際の名前をfoobarにしなければなりませんでした。
すべての関数にそれらを説明するコメントがある場合は、次のようにそれを取得することもできます。
var fubar = function() {
/*
fubar is effed up beyond all recognition
this returns some value or other that is described here
*/
//the stuff the function normally does, here
console.log(arguments.callee.toString().substr(0, 128);
}
現在の関数を呼び出した関数にアクセスするには、argument.callee.caller を使用することもできます。これにより、関数の外部から関数の名前 (または id やテキスト内のコメントなどのプロパティ) にアクセスできます。
これを行う理由は、問題の関数を呼び出したものを見つけたいからです。そもそも、この情報をプログラムで見つけたいと思うのは、おそらくこれが理由です。
したがって、上記の fubar() の例の 1 つが次の関数を呼び出したとします。
var kludge = function() {
console.log(arguments.callee.caller.id); // return "fubar" with the first version above
console.log(arguments.callee.caller.name); // return "foobar" in the second version above
console.log(arguments.callee.caller.toString().substr(0, 128);
/* that last one would return the first 128 characters in the third example,
which would happen to include the name in the comment.
Obviously, this is to be used only in a desperate case,
as it doesn't give you a concise value you can count on using)
*/
}