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の実装が一番厄介だった。

考慮漏れがありそうけど、今回はこれで切り上げることにした。