DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

実行している関数名の表示

個人的なメモです。

!function myFunction () {
    alert(arguments.callee.toString().match(/^function (.+?)\(/m)[1]);
}();

やってることは単純で、arguments.calleeプロパティで関数そのものを参照。
toStringメソッドで文字列化した上で、正規表現でfunctionで始まる文(/^function (.+?)\(/)を検索して、ヒットした部分を返すだけ。
RegExpオブジェクトをマルチラインモードにしておくのは、toStringメソッドで返ってくる値(文字列)の先頭に改行が入っているからです。
なので、マルチラインモードを使わず行頭に改行を挟んであげても可(match(/^\nfunction (.+?)\(/))。ここはそれほど深く調査してないので、仮に先頭に改行が入らないパターンがあるかもしれない…と思って上記の形にしました。

そもそも実行している関数名なんて必要なのか? って話なのですが、デバッグ中にtry・catch文入れまくっていて、どの関数から吐き出されたエラーなのかを確認したかったのですよね。

以上。

【追記 10/28 12:30】
Twitterであるふぁ(仮)さんにご指摘いただき、arguments.callee.nameでいいんじゃないの、と。そのとおりすぎだ。
先の例、実はこんなケースでエラーになるのです。

var hoge = function() {
    alert(arguments.callee.toString().match(/^function (.+?)\(/m)[1]);
};
hoge();

なんでかっていうと、関数に名前をつけずに変数宣言して代入しているので、関数に名前がついていないんですね。見ればわかるけど。
callee.nameのいいところは、こういうケースでもちゃんとanonymousと返してくれます。
なのでおすすめはこちら。

!function myFunction () {
    alert(arguments.callee.name);
}();

すっきり!

余談ですが、血迷ってthis.nameなんてしないように…。