function.length 返回函数定义时显式声明的形参个数,不包括 rest 参数,与调用时实参数量无关;适用于普通函数、箭头函数、bind 返回函数及类构造函数,常用于柯里化、参数校验等场景。

JavaScript 中的 Function.length 属性返回函数定义时声明的**形参个数**,不包括 rest 参数(...args),也不受实际调用时传入实参数量的影响。它是一个只读属性,在函数创建时就已确定。
length 只看形参声明,不看调用情况
无论你调用函数时传几个参数,length 始终反映函数定义中「显式列出」的参数个数:
-
function foo(a, b) {}→foo.length === 2 -
function bar(a, b, ...rest) {}→bar.length === 2(rest 参数不计入) -
function baz() {}→baz.length === 0 -
function qux(a = 1, b) {}→qux.length === 2(默认参数不影响 length)
箭头函数、bind 和构造函数也适用
length 是所有函数对象都具备的自有属性,包括:
- 普通函数、箭头函数:行为一致,看参数列表长度
-
func.bind(this, 1):返回的新函数length是原函数 length 减去预设参数个数(如fn(a,b,c).bind(null,1)→length === 2) - 类构造函数(
class C {}):等价于 constructor 方法,C.length === 0(因为 constructor 默认无参,除非显式声明)
常见误区:length ≠ 实参个数,也不反映运行时行为
arguments.length 或 args.length(在 rest 参数中)才是调用时的实参个数,和 Function.length 完全无关:
-
function f(x) { console.log(arguments.length); }—— 调用f(1,2,3)输出3,但f.length仍是1 - 解构参数、对象参数、函数体内的逻辑,都不会改变
length - 即使函数内部用
if (arguments.length > 2)做分支,length仍只由定义决定
实用场景:类型检查、柯里化、API 元信息
虽然平时少直接使用,但在工具函数中很有价值:
- 自动柯里化:根据
fn.length判断还需补几个参数 - 参数校验中间件:对比调用时
args.length和fn.length,提示缺失参数 - 文档生成或调试工具:快速获取函数期望接收的参数数量
- 模拟重载(有限):配合
typeof和length区分不同签名的函数调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











