個人的なメモです。
!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
なんてしないように…。