函数的 length 和 name 属性可实现轻量、无侵入的动态分发:length 匹配形参个数用于参数契约分发,name 提取语义前缀用于路由调度,二者组合提升精度;需注意默认参数、代码压缩及匿名函数等限制。

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










