充分理解 curry 并能够封装 curry.js。
curry
我对 curry(柯里化函数) 的理解:
- curry 函数接收的参数是?
答:curry 函数接收的第一个参数是一个函数,接收的后续参数是第一个参数(函数)的参数。 - curry 函数的返回值是?
答:返回值是一个新的函数,无论参数够还是不够,都是返回一个新函数,即便参数数量够了,也不会立即执行第一个参数(函数)。 - curry 函数怎么用?
答:接收剩余参数用的。 - curry 函数的应用场景?
答:不知道。。。
网上虽然介绍了很多,但是实战经验不足,体会不到它有啥用。
柯里化函数的使用示例:
// 某个函数 A 调用它需要传入 4 个参数 当我们使用 curry 调用它时 分下面几种情况
function A (a, b, c, d) {
console.log(a + b + c + d);
}
// 参数数量不够
B = curry(A, 1, 2);
此时 curry(A, 1, 2)
会返回一个新的函数。该新函数用于接收剩余参数,由于已经传入了两个参数,还差两个参数。剩余的这两个参数将由返回的新的函数来接收。
// 参数够了
B(3, 4); // => 10
// 参数依旧不够
C = B(3);
C(4); // 参数够了 会打印10
同理,此时 B(3)
会返回一个新的函数,因为参数依旧不够。返回的新函数用于接收剩余参数,此时还差一个参数。
- curry.js
/**
* 柯里化
* 用户固定某个函数的前面的参数,得到一个新的函数,新函数调用时,接收剩余参数。
*/
function curry(func, ...args) {
return function (...subArgs) {
const allArgs = [...args, ...subArgs]; // 拼接两个数组
// 参数够了
if (allArgs.length >= func.length) { // func.length 获取 func 函数的形参数量
return func(...allArgs); // 直接调用 func 函数 并将所有参数 allArgs 当做形参传进去
} else { // 参数依旧不够
return curry(func, ...allArgs); // 递归
}
}
}
codes
- 1.js
/*
在调用函数时,将数组中的值当做形参传入。
*/
function test(a, b, c) {
console.log(a, b, c);
}
const arr = [1, 2, 3];
test(...arr); // => 1 2 3
- 2.js
function cal(a, b, c, d) {
return a + b + c + d;
}
cal(1, 2, 3, 4); // => 10
function curry(func, ...args) {
return function (...subArgs) {
const allArgs = [...args, ...subArgs];
if (allArgs.length >= func.length) {
return func(...allArgs);
} else {
return curry(func, ...allArgs);
}
}
}
const newCal = curry(cal, 1, 2);
newCal(3, 4); // => 10
newCal(4, 5); // => 12
const newCal1 = newCal(5);
const newCal2 = newCal(6);
newCal1(6); // => 14
newCal2(7); // => 16