bind创建的函数length等于原函数形参个数减去预设参数个数,结果最小为0;它表示还需传入多少参数才能满足原函数需求,是只读属性,用于签名推断等场景。

bind 创建的函数,其 length 属性等于原函数的形参个数减去预设参数个数,但最小为 0。
length 的计算规则
绑定函数的 length 不是随便定的,它反映的是“还需传入多少个参数才能满足原函数的参数需求”。具体逻辑如下:
- 原函数有
n个命名参数(即形参),比如function foo(a, b, c) {}的length是 3 - 用
foo.bind(obj, x)预设了 1 个参数,则绑定函数的length变为 3 − 1 = 2 - 若预设参数个数 ≥ 原函数形参个数(例如
foo.bind(obj, 1, 2, 3)),则length为 0 - 箭头函数、无参数函数、rest 参数会影响原始 length,但 bind 仍按上述逻辑计算(rest 参数不计入 length)
实际例子对照
看几个典型情况:
-
function f(x, y, z) {}→f.length === 3f.bind(null, 1).length === 2(预设 1 个,剩 2 个待传) -
function g(a) {}→g.length === 1g.bind(null, 'x').length === 0(预设已满,无需再传) -
(function(){}).bind({}).length === 0(原函数无参数)
注意:length 不反映调用时实际传了多少参数
length 是只读属性,仅由函数定义和 bind 时的预设参数决定,和后续调用时传入多少实参无关。它用于函数签名推断、柯里化判断、工具库参数检查等场景,不是运行时动态值。
name 属性也受影响
虽然问题没问,但顺带一提:bind 后的函数 name 会自动加上 "bound " 前缀,比如 foo.bind({}).name === "bound foo";匿名函数则变成 "bound "(带空格)。











