在网上看到的函数柯里化实现js进阶教程
关于实现一个add方法,使计算结果能够满足如下预期: add(1)(2)(3) = 6 add(1, 2, 3)(4) = 10 add(1)(2)(3)(4)(5) = 15
实现如下
function add() {
// 第一次执行时,定义一个数组专门用来存储所有的参数
var _args = [].slice.call(arguments);
// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
var adder = function () {
var _adder = function() {
[].push.apply(_args, [].slice.call(arguments));
return _adder;
};
// 利用隐式转换的特性,当最后执行时隐式转换,并计算最终的值返回
_adder.toString = function () {
return _args.reduce(function (a, b) {
return a + b;
});
}
return _adder;
}
return adder.apply(null, [].slice.call(arguments));
}
// 输出结果,可自由组合的参数
console.log(add(1, 2, 3, 4, 5)); // 15
console.log(add(1, 2, 3, 4)(5)); // 15
console.log(add(1)(2)(3)(4)(5)); // 15
收集参数的函数_adder这块看不懂,它为什么要return 自身呢,也不是递归调用。我把这句话去掉之后,会报错
add(...)(...) is not a function
函数柯里化,简单地说就是使一个函数的参数,通过多次传入参数,再执行
“多次传入参数”的实现,就要求每次传入参数执行后,除了最后一次执行,期间调用函数的返回值必须是一个函数
去掉之后默认return undefined。
举个栗子:
“函数柯里化”是一个概念,不是一段代码、一种方法。可以有多种实现方式。就表现而言,这个函数是柯里化的。
而需要实现如下无限制调用,只需要通过闭包缓存入参,返回出参函数中加个入参为空结束执行的判断
评论回复:
