Function.prototype.toString()

toString() メソッドは、関数のソースコードを表す文字列を返します。

試してみましょう

構文

function.toString()

返値

関数のソースコードを表す文字列です。

解説

Function オブジェクトは、 Object から継承した toString メソッドをオーバーライドします。つまり、 Object.prototype.toString を継承しません。 Function オブジェクトについて、 toString メソッドは関数宣言を表現するオブジェクトを表す文字列を返します。

Function を文字列値として表現するとき、JavaScript は自動的に toString メソッドを呼び出します。例えば、関数が文字列と連結されるときです。

this 値のオブジェクトが Function オブジェクトでない場合、 toString() メソッドは TypeError 例外 ("Function.prototype.toString called on incompatible object") を発生します。

js
Function.prototype.toString.call("foo"); // TypeError

toString() メソッドが組込み関数オブジェクトや Function.prototype.bind 作成された関数に対して呼び出されると、 toString() は、次のようなネイティブ関数文字列を返します。

js
"function () {\n    [native code]\n}";

toString() メソッドが Function コンストラクターで生成された関数に対して呼び出されると、 toString() は "anonymous" という名前の関数宣言に、提供された引数と関数の本体を合成したソースコードを返します。

+ 演算子を使用して、関数の文字列表現を明示的に取得することもできます。

js
function foo() {
  return "bar";
}
console.log(foo + ""); // "function foo() { return 'bar' }"

実際のソースコードと toString の結果との比較

Function Function.prototype.toString の結果
function f(){}
"function f(){}"
class A { a(){} }
"class A { a(){} }"
function* g(){}
"function* g(){}"
a => a
"a => a"
({ a(){} }.a)
"a(){}"
({ *a(){} }.a)
"*a(){}"
({ [0](){} }[0])
"[0](){}"
Object.getOwnPropertyDescriptor({
    get a(){}
}, "a").get
"get a(){}"
Object.getOwnPropertyDescriptor({
    set a(x){}
}, "a").set
"set a(x){}"
Function.prototype.toString
"function toString() { [native code] }"
(function f(){}.bind(0))
"function () { [native code] }"
Function("a", "b")
"function anonymous(a\n) {\nb\n}"

仕様書

Specification
ECMAScript Language Specification
# sec-function.prototype.tostring

ブラウザーの互換性

BCD tables only load in the browser

関連情報