js函数柯里化

什么是函数柯里化?

        在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。

        在直觉上,柯里化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”。所以对于有两个变量的函数y,x,如果固定了 y = 2,则得到有一个变量的函数 2,x。


        举个例子:

function multi(a,b){
    return a * b;
}

这是一个求两个数字的乘积的简单函数,每次调用时需要传入两个参数,但是如果我要求5的倍数,每次要重复输入

multi(5,1);
multi(5,2);
...

发现,这个5,是否可以不用每次输入呢?改造一下这个函数

function multiNum(a){
    return function(b){
	return a * b;
    };
}
var multiFive = multiNum(5);
multiFive(3);  //返回15

    通过对multi函数的包装,只要调用multiFive,传入一个参数就可以实现5的乘积。

    这里的multiFive函数就是柯里化multi后的函数。

通用表达式:

function currying(fn){
    var arg = [].slice.call(arguments,1);
    return function(){
        var newArg = [].slice.call(arguments);
        var finalArg = arg.concat(newArg);
        return fn.apply(null,finalArg);
    }
}
    这里的currying函数就是柯里化的通用表达式。柯里化一下之前的multi函数:
var curryMulti = currying(multi,5);
curryMulti(3); //返回15

柯里化作用

    1.提高适用性,参数复用

        上面的curryMulti例子可以看出,柯里化multi之后,只需要传入一个参数就可以实现5的倍数。

    2.延迟计算

        下面是一个求和的函数:

var add = function(){
    var sum = 0;
    for(var i = 0,len= arguments.length; i< len ;i++){
       sum += arguments[i]
    }
    return sum;
}
下面是一个延迟执行的柯里化函数:
var curryDelay=function(fn){ 
	var args=Array.prototype.slice.call(arguments,1); 
	var ary=args; 
	return function(){
		if(arguments.length==0){ 
			return fn.apply(null,ary); 
		}else{
		    ary=ary.concat(Array.prototype.slice.call(arguments)); 
                    return arguments.callee;
		} 
	} 
}
对add函数进行柯里化:
curryDelay(add,3,4,5,6)(); //返回18
通过柯里化函数后,curryDelay只在参数为空时才会执行,返回运行结果。



猜你喜欢

转载自blog.csdn.net/u014399368/article/details/80930930