在上网找到的一种概念,值得深入学习一下。柯里化在维基百科上定义为:是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。看起来有点迷糊吧,”如果你固定某些参数,你将得到接受余下参数的一个函数”,这句我想比较好理解一些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//柯里化
function curry(fn) {
    var outerArgs = Array.prototype.slice.call(arguments, 1);
    return function() {
        var innerArgs = Array.prototype.slice.call(arguments),finalArgs = outerArgs.concat(innerArgs);
        return fn.apply(null, finalArgs); //注意别漏了return
    };
}
     
//传递参数1,参数2
var func1 = curry(function(){
    var args = [].slice.call(arguments);
    console.log(args.join(':'));
},"1", "2");
     
//传递参数3,参数4
var func2 = curry(func1, "3", "4");
setInterval(curry(func2, "5", "6"), 1000);

接下了反柯里化,

说明:

1.一种是使用匿名单参数函数来实现多参数函数的方法。

2.给函数预先传入参数,缩小函数的适用范围,并返回一个更精确地函数,起作用扩大函数的适用性,使本来作用特定对象所拥有功能的函数可以对全体对象适用。

看了一下上面的我的头有点晕了,还是用代码来实现以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//反柯里化
Function.prototype.uncurry = function(){
    var _this = this; //_this就是Array.prototype.push
    return function(){
        //Array.prototype.push当做Function.prototype.call的this传进去
        return Function.prototype.call.apply(_this, arguments);
        //arguments是[obj, 'first'],apply接受数组形式的参数
        //接下来被直接传递给Array.prototype.push.call
        //call接受以逗号分割的N个参数的形式
        //所以arguments中的第一个参数(这里为obj),会被当成call里面的this,
        //其他的参数依次传入call
        //整个代码相当于Array.prototype.push.call(obj, 'first');
    }
}
var push = Array.prototype.push.uncurry();
var obj = {};
push(obj,'first');
console.log(obj);

只能感叹,浓缩就是精华啊。

感觉用处并不是很大,也许某个时候就是它展现的的舞台。

如果没看懂,请点击参考2,讲的很好。