function list(...args) {
  return args;
}

function addArguments(arg1, arg2) {
  return arg1 + arg2;
}

console.log(list(1, 2, 3)); // [1, 2, 3]

console.log(addArguments(1, 2)); // 3

// 创建一个带有预设前导参数的函数
const leadingThirtySevenList = list.bind(null, 37);

// 创建一个带有预设第一个参数的函数。
const addThirtySeven = addArguments.bind(null, 37);

console.log(leadingThirtySevenList()); // [37]
console.log(leadingThirtySevenList(1, 2, 3)); // [37, 1, 2, 3]
console.log(addThirtySeven(5)); // 42
console.log(addThirtySeven(5, 10)); // 42
//(最后一个参数 10 被忽略)

为何(最后一个参数 10 被忽略)

当你使用 .bind() 方法绑定一些参数到一个函数时,你实际上是在创建一个新的函数,它具有预设的初始参数。这些预设的参数在绑定时已经确定,它们将在新函数被调用时作为第一批参数传入,后续调用时传入的参数将按顺序排在这些预设参数之后。
在 addThirtySeven 函数的示例中,.bind(null, 37) 创建了一个新函数,其中第一个参数(arg1)被预设为 37。当 addThirtySeven(5) 被调用时,数字 5 被作为第二个参数(arg2),所以函数 addArguments 接收的参数为 37(arg1)和 5(arg2),结果是这两个数相加,即 42。
继续这个例子,当你调用 addThirtySeven(5, 10) 时,尽管你传入了两个参数(5 和 10),由于 addArguments 函数只期望和处理两个参数(arg1和arg2),在绑定时已经预设了第一个参数(arg1)为 37,所以传入的第一个参数(5)实际上会被作为第二个参数(arg2)。第二个参数(10)由于在函数 addArguments 中没有对应的第三个参数接收它,所以会被函数忽略,因此没有起作用。
总结来说,addThirtySeven 函数不会处理超过两个参数的情况,因为它是基于 addArguments 函数的,而 addArguments 只处理两个参数。绑定操作将预设的参数固定在参数列表的前面,超出原函数参数数量的额外参数会被忽略。

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

required