一、Curry

我对科里化的理解是将一个固定参数的函数变成不固定参数,且不同参数表现不同的函数。

而且科里化很像闭包函数,和闭包不同的地方在于参数可以不同

上面只是一个个人理解,不涉及任何定义

比如函数 sayWelCome(str,name) 接收两个参数,如果是sayWelcome("Hi","Postbird") 会输出 Hi : Postbird;

    function sayWelcome(str, name) {
        console.log(str + " : " + name);
    }
    sayWelcome("Hi","Postbird"); // Hi : Postbird

现在需要做到类似于使用闭包的效果:

但是不使用下面的这种闭包,构建闭包函数的之后,只能传入一个参数,就是str ,需要做的是可以传入0个,1个,2个参数。

    function sayWelcome(str){
        return function (name) {
            console.log(str + " : " + name);
        }
    }
    var sayHi = sayWelcome("Hi");
    sayHi("postbird");

二、实现科里化

javascript的函数科里化其实也是利用闭包函数来实现:

  • 函数科里化之后,可能传入不完整的参数,也可能传入完整的参数
  • 针对某个函数,需要用已经传入的参数(这个参数可能是全的也可能不全)来返回一个闭包,但是这个闭包返回的时候,需要算上之前已经传过来的参数。
    // 函数科里化
    function curry(fn) {
        // 除了第一个函数名 获取剩下的参数
        var args = Array.prototype.slice.call(arguments, 1);
        // 返回一个匿名函数
        return function () {
            // 首先获取所有的匿名函数的参数
            var innerArgs = Array.prototype.slice.call(arguments);
            // 将上面的函数参数列表参数连接上后面函数调用的时候给的参数 构成完成的参数数组
            var finalArgs = args.concat(innerArgs);
            // 使用apply 来执行这些参数列表
            return fn.apply(null, finalArgs);
        }
    }

代码来自《javascript高级程序设计》

效果:

    var sayHi = curry(sayWelcome, "Hi");
    sayHi("postbird") // Hi : postbird
    var sayHelloPostbird = curry(sayWelcome, "Hello", "Postbird");
    sayHelloPostbird(); // Hello : Postbird
    var sayNoting = curry(sayWelcome);
    sayNoting("hi","ptbird") // hi : ptbird
    var sayError = curry(sayWelcome);
    sayError();

最后那个因为没有传入两个参数,所以都是 undefined

1.jpg