File tree 1 file changed +34
-0
lines changed
1 file changed +34
-0
lines changed Original file line number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments