Skip to content

Commit 2bcb1dd

Browse files
committed
feat: 函数柯里化
1 parent 068c061 commit 2bcb1dd

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

ByteDance/curry.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
function curry(fn) {
2+
var argArr = Array.prototype.slice.call(arguments, 1); // curry的第二个参数以及后面的参数,初始值通常情况下是[]
3+
var len = fn.length; // 待柯里化函数的参数个数
4+
return function () {
5+
// 获得本轮递归执行的函数的参数
6+
var innerArgs = Array.prototype.slice.call(arguments);
7+
// 将上一轮递归的参数与本轮递归的参数进行合并
8+
// 注意: argArr 里面缓存了上一轮递归执行参数合并后的结果
9+
argArr = argArr.concat(innerArgs);
10+
if (argArr.length === len) {
11+
// 如果最终合并后的参数个数,与被柯里化的函数的参数个数相同
12+
// 那么将合并后的参数作为被柯里化函数的参数,执行
13+
// 相当于提取所有的参数,然后拿到原函数里面去执行
14+
var result = fn.apply(null, argArr);
15+
// 到这里就执行完成了
16+
argArr = [];
17+
return result;
18+
} else {
19+
// 返回正在执行的函数,也就是函数自身,相当于递归
20+
// 但是递归层数是动态的
21+
// 这里会把本轮递归的参数通过 argArr 带到下一轮递归中
22+
return arguments.callee;
23+
}
24+
}
25+
}
26+
27+
function add(a, b, c) {
28+
return a + b + c;
29+
}
30+
31+
const addEx = curry(add);
32+
console.log(addEx(1, 2, 3)); //6
33+
console.log(addEx(1)(2, 3)); //6
34+
console.log(addEx(1)(2)(3)); //6

0 commit comments

Comments
 (0)