函数的 name 和 length 是 javascript 中天然可用的只读元数据,可直接用于自动注册、参数校验、文档生成等轻量级元编程场景;name 提供函数标识,length 反映形参个数,二者结合可构建函数描述符,但需注意压缩混淆导致的不可靠性及安全兜底。
函数的 name 和 length 是 javascript 中天然可用的只读元数据,无需额外装饰或编译步骤,就能在运行时反映函数的定义特征。它们虽简单,却是轻量级元编程的基础——可用于自动注册、参数校验、文档生成、aop 前置拦截等场景。
用 name 实现自动行为绑定与标识注入
函数名是其最直接的身份标签。在事件系统、插件注册或路由映射中,可避免手动传入字符串标识:
- 将函数直接作为 handler 注册,通过
handler.name自动生成 key(如onSubmit→"submit") - 在测试框架中,用
it(fn.name, fn)自动提取用例标题,省去重复写字符串 - 构建 DSL 时,把具名函数名转为指令名(
fetchUser→<fetch-user></fetch-user>),配合Object.defineProperty动态挂载到上下文
用 length 辅助运行时参数契约推断
length 返回形参个数(不含 rest 参数),可在不依赖 TypeScript 或 JSDoc 的情况下做基础调用适配:
- 实现通用包装器:若
fn.length === 0,调用前自动注入 context;若为1,默认传入 event 对象 - 在柯里化工具中,根据
length决定何时触发实际执行(如curry(add).length === 2,收集满 2 个参数才求值) - 与 Proxy 结合,在
apply拦截中检查实参长度是否匹配target.length,不匹配则抛出带函数名的清晰错误
组合 name + length 构建函数描述符
二者结合可生成结构化元信息,用于调试、序列化或跨环境桥接:
- 定义一个辅助函数
describe(fn),返回{ name: fn.name, arity: fn.length, isAsync: fn.toString().includes("async") } - 在 RPC 客户端中,将该描述符随请求发送,服务端据此做签名验证或降级处理
- 配合
Function.prototype.toString()提取注释(如 JSDoc 块),拼装成轻量 API 文档对象,供 devtools 插件消费
注意边界:不可靠场景与安全加固
这些属性易被压缩、混淆或动态构造破坏,生产环境需兜底:
- Webpack/Vite 默认启用
function.name保留(optimization.concatenateModules: false),但 Terser 可能改名,建议配置keep_fnames: true - 箭头函数、匿名函数
name为空字符串,应 fallback 到 Symbol 或显式fn.displayName = "xxx" - 不要仅凭
length做关键权限判断(如“参数少于 2 个禁止调用”),它不反映运行时实际传参逻辑










