函数的 toString 方法能直接返回源代码字符串,是调试和分析运行时函数行为的轻量级利器,支持普通函数、箭头函数、类方法及 new Function 创建的函数,但内置函数可能仅显示 “[native code]”。

函数的 toString 方法能直接返回函数的源代码字符串,是调试和分析运行时函数行为的轻量级利器——尤其在无法打断点、或需动态检查闭包/高阶函数生成逻辑时非常实用。
查看函数原始定义(含注释与格式)
原生 Function.prototype.toString() 会尽可能还原声明时的源码(包括空格、换行、注释),比 console.log(fn) 或 fn + '' 更可靠:
- 箭头函数、普通函数、方法、类中方法均支持;
- 对于通过
new Function(...)创建的函数,返回的是构造时传入的字符串,不含额外修饰; - 注意:某些内置函数(如
Array.prototype.map)可能返回"function map() { [native code] }",无法看到实现细节。
识别高阶函数的实际返回值
当函数由工厂函数或闭包动态生成时,toString() 可验证它是否按预期构建:
const makeAdder = (x) => (y) => x + y;<br>const add5 = makeAdder(5);<br>console.log(add5.toString());<br>// 输出:"(y) => x + y" —— 注意 x 是自由变量,未被内联
这有助于确认闭包捕获是否正确,也方便对比不同调用生成的函数是否“表面相同但实际不同”(例如依赖外部状态的函数体可能一致,但执行结果不同)。
检测函数是否被篡改或代理包装
在调试第三方库或框架(如 React、Vue 的响应式包装)时,toString() 可快速判断函数是否被重写或代理:
- 若输出中包含
[native code],大概率是原生或被优化过的函数; - 若出现明显新增逻辑(如日志注入、try-catch 包裹、this 绑定处理),说明已被中间层修改;
- Proxy 对象上的函数若未自定义
apply或get拦截toString,则仍返回原始函数体;但若拦截了get并返回新函数,则其toString()就是那个新函数的源码。
辅助反混淆与运行时代码审查
在调试压缩/混淆后的代码时,可结合 eval(仅限开发环境!)或 Function 构造器逆向验证逻辑:
const fn = /* 来自某 bundle 的匿名函数 */;<br>console.log(fn.toString()); // 先看结构<br>// 复制输出内容,稍作格式化后人工阅读或粘贴到 AST 工具中分析
虽然不能完全还原变量名,但控制流(if/for/while)、调用关系、关键字符串常量通常保留,对定位问题模块很有帮助。


















