Function.prototype.toString()
toString()
是 Function
实例的方法,返回一个表示此函数源代码的字符串。
试试看
语法
toString()
参数
无。
返回值
一个表示函数源代码的字符串。
描述
Function
对象覆盖了从 Object
继承的 toString()
方法;它不会继承 Object.prototype.toString
。对于用户定义的 Function
对象,toString
方法返回一个包含用于定义函数的源代码段的字符串。
当 Function
需要以文本值形式表示时,JavaScript 会自动调用 toString
方法,例如当函数与字符串连接时。
如果在非 Function
对象上调用 toString()
方法,则该方法将抛出 TypeError
异常(“Function.prototype.toString called on incompatible object”)。
Function.prototype.toString.call("foo"); // throws TypeError
如果在内置函数对象、通过 Function.prototype.bind()
创建的函数或其他非 JavaScript 函数上调用 toString()
方法,则 toString()
返回一个看起来像 本机函数字符串 的字符串
function someName() { [native code] }
对于内在对象方法和函数,someName
是函数的初始名称;否则其内容可能由实现定义,但始终以属性名称语法表示,如 [1 + 1]
、someName
或 1
。
注意: 这意味着对本机函数字符串使用 eval()
将始终导致语法错误。
如果在通过 Function
构造函数创建的函数上调用 toString()
方法,则 toString()
返回一个使用提供的参数和函数体合成的名为“anonymous”的函数声明的源代码。例如,Function("a", "b", "return a + b").toString()
将返回
function anonymous(a,b ) { return a + b }
自 ES2018 以来,规范要求 toString()
的返回值与声明时完全相同的源代码,包括任何空白符和/或注释——或者,如果主机出于某种原因无法访问源代码,则要求返回一个本机函数字符串。支持此修改后的行为可以在 兼容性表 中找到。
示例
比较实际源代码和 toString 结果
function test(fn) {
console.log(fn.toString());
}
function f() {}
class A {
a() {}
}
function* g() {}
test(f); // "function f() {}"
test(A); // "class A { a() {} }"
test(g); // "function* g() {}"
test((a) => a); // "(a) => a"
test({ a() {} }.a); // "a() {}"
test({ *a() {} }.a); // "*a() {}"
test({ [0]() {} }[0]); // "[0]() {}"
test(Object.getOwnPropertyDescriptor({ get a() {} }, "a").get); // "get a() {}"
test(Object.getOwnPropertyDescriptor({ set a(x) {} }, "a").set); // "set a(x) {}"
test(Function.prototype.toString); // "function toString() { [native code] }"
test(function f() {}.bind(0)); // "function () { [native code] }"
test(Function("a", "b")); // function anonymous(a\n) {\nb\n}
注意,在 Function.prototype.toString()
修改之后,当调用 toString()
时,实现绝不允许合成不是本机函数字符串的函数的源代码。该方法始终返回用于创建函数的精确源代码——包括上面的 getter 和 setter 示例。Function
构造函数本身具有合成函数的源代码的能力(因此是隐式 eval()
的一种形式)。
获取函数的源代码文本
可以通过将函数强制转换为字符串来获取函数的源代码文本——例如,将其包装在模板文字中
function foo() {
return "bar";
}
console.log(`${foo}`);
// function foo() {
// return "bar";
// }
此源代码文本是精确的,包括任何散布在其中的注释(否则不会存储在引擎的内部表示中)。
function foo /* a comment */() {
return "bar";
}
console.log(foo.toString());
// function foo /* a comment */() {
// return "bar";
// }
规范
规范 |
---|
ECMAScript 语言规范 # sec-function.prototype.tostring |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。