js柯里化函数

 1 function sub_curry(fn) {
 2     var args = [].slice.call(arguments, 1); 
 3     return function() {
 4         return fn.apply(this, args.concat([].slice.call(arguments)));
 5     };
 6 }
 7 
 8 function curry(fn, length) {
 9     length = length || fn.length;
10     return function() {
11         if (arguments.length < length) {
12             var combined = [fn].concat(Array.prototype.slice.call(arguments));
13             return curry(sub_curry.apply(this, combined), length - arguments.length);
14         } else {
15             return fn.apply(this, arguments);
16         }
17     };
18 }
19 
20 function add(a, b, c) {
21     console.log(a + b + c);
22 }
23 
24 curry(add)(1, 2, 3);
25 curry(add)(1, 2)(3);
26 curry(add)(1)(2, 3);
27 curry(add)(1)(2)(3);

 注:

(1)arguments是调用函数时传入的入参;

(2)[].slice.call(arguments)同 Array.prototype.slice.call(arguments); 作用是把arguments转化为数组格式。

(3)fn.length可以拿到函数的入参的长度

猜你喜欢

转载自www.cnblogs.com/vicky24k/p/11743331.html