函数柯基化
概念: 是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。概念没看懂得看以下代码
//普通累加函数
add(1,2.3) // 结果 6
//currying化,花式传参
add(1)(2)(3) // 结果 6
add(1,2)(3) // 结果 6
add(1)(2,3) // 结果 6
优点:个人看来currying,代码比较清晰,易维护,还是累加的例子,如果三个数组累加,要先concat连接三个数组再进行累加,而currying后的函数,函数式编程add(arr1)(arr2)(arr3)
清晰明了,易于修改维护
类似于add(1)(2)...
这样的函数多次传参直觉就是闭包
currying化的函数需要使用闭包来存放中间变量
闭包
粗略的回复下闭包概念,在外部f1
函数内部定义的函数f2
,f1
作为外部访问f2
中变量的桥梁
function f1(){
var n = 123;
function f2(){ //f2是一个闭包
alert(n)
}
return f2;
}
f2可以访问f2内部的变量和向上寻找f1内部的变量,f1可以访问f1内部的变量,不能访问f2的变量,这是闭包的基本用法
currying
实现add(1)(2)(3),add(1,2),这是一道常见的面试题
//编写add方法让下列成立
console.log(add(1)(2)(3)) //6
console.log(add(1,2,3)(4)) //10
console.log(add(1)(2)(3)(4)(5)) //15
console.log(add(2,6)(1)) //9
function add() {
// 第一次执行时,伪数组转数组,添加到_args,后续都直接进行内部的_adder方法
var _args = Array.from(arguments);
//var _args = [...arguments];
// 在内部声明一个函数,利用闭包的特性保存_args并收集所有的参数值
var _adder = function() {
_args.push(...arguments);
return _adder;
};
// 利用toString隐式转换的特性,改写_adder的toString方法为累加
_adder.toString = function () {
return _args.reduce(function (a, b) {
return a + b;
});
}
return _adder;
}