IEで関数名を取得する
IE以外のブラウザであれば、関数.name
で関数名を取得することができる。
var func = function hoge() { } func.name; // => "hoge"
事実上標準でES6にも取り入れられそう。
しかしIEではバージョン11においても関数.name
は定義されていない。そこで、Function.prototype.toString
の結果を使って関数名を取得するコードを書くことにした。
今回は対象がIEだけだけど、複数のブラウザで確かめてみるとFunction.prototype.toString
の実装はまちまちだった(ES5仕様書にも実装依存と書いてある)。後述のテスト用ページを複数のブラウザで見比べると分かりやすい。
- Firefoxでは、仮引数リストの前の「
(
」(開き括弧)より前の部分は正規化される(コメントは削除され、エスケープされたキーワードと識別子は変換される)。 - Chromeでは、
function
キーワードをエスケープするとエラーになる。その他はFirefoxと同じ。 - IEでは、最初の
function
キーワードから最後の「}
」(閉じ波括弧)まで完全にソースコードの通りの文字列を得られる。
今回の目的において、コメントやエスケープを考慮しなければならないIEの実装が一番厄介だった。
- ソースコード
- テスト用ページ(Function.prototype.getNameを定義するバージョン)
- テスト用ページ(Function.prototype.nameを定義するバージョン・IE8以下は無視)
考慮漏れがありそうけど、今回はこれで切り上げることにした。