定义
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
意义
下面是我个人的理解,不知是否正确,可能需要在往后的工作中不断去实践才知道柯里化的好处。
function add(x,y){
return x + y;
}
add(1,2);//3
add(1,3);//4
add(1,4);//5
//我们每次都用到了1,但我们可能也会用到其他数字
var add = function(x) {
return function(y) {
return x + y;
};
};
var increment = add(1);
increment(2);// 3
increment(3);// 4
其实就是相当于,在函数被多次调用,参数不能确定,但有可能出现相同参数的时候,第二种写法的适用性就更强了。
柯里化函数代码及例子
var currying = function(fn) {
var args = [].slice.call(arguments, 1);
return function() {
var newArgs = args.concat([].slice.call(arguments));
return fn.apply(null, newArgs);
};
};
var add = function (num1, num2, num3){
return num1 + num2 + num3;
}
var increment1 = currying(add, 1);
// 假设很多地方调用add函数,其中都传入了一个参数 1,那么我们就可以先确定一个参数,然后再多次调用
var result1 = increment1(2, 3);// 6
var result2 = increment1(3, 4);// 8
// 上面两次调用,3也重复了,那么我们又可以这样做
var increment2 = currying(add, 1, 3);
var result1 = increment2(2);// 6
var result2 = increment2(4);// 8
利用函数柯里化进行Dom操作
比如页面有三个灰色的div,我点击下面按钮需要呈现的不同效果
QQ图片20170506203513.png可以确定的是,无论点击哪一个按钮,第一个都要变红。
利用currying函数
var currying = function(fn) {
var args = [].slice.call(arguments, 1);
return function() {
var newArgs = args.concat([].slice.call(arguments));
return fn.apply(null, newArgs);
};
};
var changeRed = function(){
var blockArr = [].slice.call(arguments);
for(var i=0;i<blockArr.length;i++){
var blcok = document.getElementById(blockArr[i]);
blcok.style.backgroundColor = "red";
}
}
var toRed = currying(changeRed,"div1");
接下来,我们只需要让按钮点击去执行toRed函数就行了
<button onclick="toRed()">点击让第一个变红</button>
<button onclick="toRed('div2')">点击让第一个和第二个变红</button>
<button onclick="toRed('div3')">点击让第一个和第三个都变红</button>
<button onclick="toRed('div2','div3')">点击让全部都变红</button>
总结
如果一个函数,其中一个或多个参数可能相同的情况下,我们不需要再次定义一个函数(这个函数的参数将相同的参数设为运算时固定的值),函数柯里化,从程序表达的角度出发,提高了函数的适用性。
网友评论