javascript函数签名解析需分层正则匹配函数名与参数,用括号计数法安全切分参数项,ts中分离类型与默认值;但纯正则不可靠,推荐ast解析器如acorn。

JavaScript 函数签名解析的核心是用正则提取函数名、参数列表(含解构、默认值、剩余参数)、返回类型(TypeScript)等结构。关键在于分层匹配,避免单一大而全的正则——它容易因嵌套括号、字符串字面量或注释失效。
基础函数声明/表达式匹配
先区分常见函数形式:函数声明 function foo(a, b = 1) {}、箭头函数 const bar = (x, ...rest) => {}、方法简写 method(a) {}。可用以下正则捕获函数名和参数部分:
-
/function\s+([$\w]+)\s*\(([^)]*)\)/—— 匹配命名函数声明,$1 是函数名,$2 是原始参数字符串 -
/([$\w]+)\s*=\s*(?:\([^)]*\)|[$\w]+)\s*=>/—— 粗略匹配箭头函数左侧,需配合后续处理 -
/([$\w]+)\s*\(([^)]*)\)\s*{/—— 匹配对象方法或类方法(注意上下文,避免误匹配普通括号)
安全提取参数列表内容
参数字符串如 a, { x, y = 10 }, ...rest, z = 'hello' 含嵌套括号和等号,不能直接用 split(',')。推荐用“括号计数法”解析:
- 遍历字符,遇
(、{、[计数加 1;遇)、}、]计数减 1 - 只在计数为 0 且遇到逗号时切分参数项
- 对每个参数项再用正则识别结构:
/^(\.{3})?\s*([\s\S]+?)\s*(?==\s*|,|$)/提取剩余参数标记、变量名主体
处理默认值与类型标注(TS 支持)
TypeScript 中参数可能带类型和默认值,如 name: string = 'anon'。可分两步提取:
- 用
/([^=]+)=\s*(.+)$/分离默认值(注意等号必须在最外层、非字符串内) - 对左侧(如
count: number)用/^(\s*[\s\S]+?)\s*:\s*([\s\S]+?)\s*$/提取变量名和类型(仅当存在冒号且不在字符串/注释中) - 实际项目建议先用
acorn或@babel/parser做 AST 解析,正则仅作轻量预处理或高亮场景使用
注意事项与边界情况
纯正则无法 100% 可靠解析 JS 函数签名,尤其遇到以下情况:
- 字符串字面量中的括号或逗号:
function f(x = "a,b(c)") {} - 模板字符串或正则字面量:
function g(re = /a(b)/) {} - 多行参数、注释混入:
function h(// comment\n a /* default */, b) {} - 箭头函数无括号单参数:
const fn = x => x * 2—— 参数部分为空字符串
生产环境推荐结合语法分析器;若坚持用正则,务必先做源码预清洗(移除注释、字符串占位),再分阶段匹配。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











