# 17.函数柯里化
# 面试原题
sum(1)(2)(3).count(); //6
function curryingAdd(x) {
let sum = x;
let temp = function (y) {
sum += y;
return temp;
};
temp.count = function () {
return sum;
};
return temp;
}
console.log(curryingAdd(1)(2)(3).count()); //6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6;
add(1, 2, 3)(4) = 10;
add(1)(2)(3)(4)(5) = 15;
function add() {
// 第一次执行时,定义一个数组专门用来存储所有的参数
var _args = Array.prototype.slice.call(arguments);
// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
var _adder = function() {
_args.push(...arguments);
return _adder;
};
// 利用toString隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
_adder.toString = function () {
return _args.reduce(function (a, b) {
return a + b;
});
}
return _adder;
}
add(1)(2)(3) // 6
add(1, 2, 3)(4) // 10
add(1)(2)(3)(4)(5) // 15
add(2, 6)(1) // 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3)() = 6;
add(1, 2, 3)(4)() = 10;
add(1)(2)(3)(4)(5)() = 15;
function add(...initArgs) {
// 第一次执行时,定义一个数组专门用来存储所有的参数
var _args = initArgs.slice();
// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
var _adder = function (...args) {
if (args.length > 0) {
if (args.length) _args.push(...args);
return _adder;
} else {
console.log(
_args.reduce((a, b) => {
return a + b;
})
);
}
};
return _adder;
}
add(1)(2)(3)(); // 6
add(1, 2, 3)(4)(); // 10
add(1)(2)(3)(4)(5)(); // 15
add(2, 6)(1)(); // 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function plus(value) {
"use strict";
var add = function () {
var args = [];
var adder = function adder() {
Array.prototype.push.apply(args,Array.prototype.slice.apply(arguments))
return adder;
}
adder.toString = function () {
return args.reduce(function(a, b) {
return a + b;
})
}
return adder;
}
return add()(value);
}
plus(2)(3)(5).toString(); // 10;
作者:谢南波
链接:https://www.imooc.com/article/275737
来源:慕课网
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 柯里化函数封装
function curry(func, args) {
args = args || [];
const length = func.length; // 函数形参数量
return function () {
let subArgs = args.slice();
for (let i of arguments) {
subArgs.push(i);
}
if (subArgs.length >= args) {
return func.apply(this, subArgs);
} else {
return curry.call(this, func, subArgs);
}
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15