函数的 length 和 name 属性可实现轻量、无侵入的动态分发:length 匹配形参个数用于参数契约分发,name 提取语义前缀用于路由调度,二者组合提升精度;需注意默认参数、代码压缩及匿名函数等限制。
函数的
和
属性是 JavaScript 中天然可用的元数据,无需额外装饰或注解就能反映函数的形参个数和标识名。利用它们可实现轻量、运行时无侵入的动态分发逻辑——比如根据参数数量自动选择重载函数,或按函数名前缀路由调用。
基于 length 的参数驱动分发
返回函数声明时的形参个数(不包括 rest 参数),适合做“参数契约”匹配。例如实现一个支持多签名的通用 API 调用器:
收集同名但
不同的函数(如
、
可统一注册为
多态)
调用时统计实参个数,查找
的最匹配函数
注意:箭头函数、bind 后函数的
可能被修正(如
),应优先使用原始函数引用
基于 name 的语义化路由分发
是函数的字符串标识,可用于命名约定驱动的调度。例如定义一组处理函数:
、
、
,通过解析
提取动作与资源:
用正则提取
模式,生成路由键
构建映射表
,按业务事件类型动态查表调用
调试友好:
直观可见意图,比 symbol 或字符串常量更自解释
组合 length + name 实现双维度分发
单一维度易冲突,组合使用可提升精度。例如在命令行工具中支持相同命令名但不同参数结构:
函数
(
)表示默认部署
函数
(
)表示指定环境
函数
(
)表示指定环境与区域
分发器先按
前缀(如
)归组,再按
匹配最接近的实现
注意事项与边界
这类元数据分发简洁高效,但需留意限制:
对含默认值参数会减去已设默认值的形参(
的
是
)
在 minify 后可能被破坏(如压缩为
),生产环境建议配合
注释或构建时注入 source map 映射
不适用于匿名函数或动态生成函数(
的
为空,
为
)
lengthnamelengthlengthfetchfetchWithTimeoutfetchlength === args.lengthlengthfn.bind(null, 1).length === fn.length - 1namehandleUserCreatehandleUserUpdatehandlePostDeletenamehandle${Resource}${Action}user:create{ 'user:create': handleUserCreate, ... }console.log(fn.name)deploy()length === 0deployEnv(env)length === 1deployEnvRegion(env, region)length === 2namedeploylengthlength(a, b = 1) => {}length1namea/*#__PURE__*/Function('return 1')namelength0