阅读597 返回首页    go 阿里云 go 技术社区[云栖]


前端开发中的柯里化

一、 定义

引用维基百科的定义:

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把**接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术**。这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的,尽管它是Moses Schönfinkel和戈特洛布·弗雷格发明的。

按照轮子哥的说法:

从纯粹的语义上,curry化就是lambda表达式的一个糖,不要想太多。

//常规写法
let sum= (a,b,c)=>{return a+b+c};

//柯里化写法
let currySum = a => b => c => {return a+b+c};
function currying(fn) {
            var slice = Array.prototype.slice,
            __args = slice.call(arguments, 1);
            return function () {
                var __inargs = slice.call(arguments);
                return fn.apply(null, __args.concat(__inargs));
            };
        }

二、意义

2.1 提高适用性

function square(i) {
    return i * i;
}

function dubble(i) {
    return i *= 2;
}

function map(handeler, list) {
    return list.map(handeler);
}

// 数组的每一项平方
map(square, [1, 2, 3, 4, 5]);
map(square, [6, 7, 8, 9, 10]);
map(square, [10, 20, 30, 40, 50]);
// ......

// 数组的每一项加倍
map(dubble, [1, 2, 3, 4, 5]);
map(dubble, [6, 7, 8, 9, 10]);
map(dubble, [10, 20, 30, 40, 50]);

柯里化不仅仅是提高了代码的合理性,更重的它突出一种思想---降低适用范围,提高适用性。

2.2 延迟执行

var curry = function(fn) {
    var _args = []
    return function cb() {
        if (arguments.length == 0) {
            return fn.apply(this, _args)
        }
        Array.prototype.push.apply(_args, arguments);
        return cb;
    }
}

2.3 固定易变因素

柯里化特性决定了它这应用场景。提前把易变因素,传参固定下来,生成一个更明确的应用函数。最典型的代表应用,是bind函数用以固定this这个易变对象。

Function.prototype.bind = function(context) {
    var _this = this,
    _args = Array.prototype.slice.call(arguments, 1);
    return function() {
        return _this.apply(context, _args.concat(Array.prototype.slice.call(arguments)))
    }
}

最后更新:2017-08-13 22:23:51

  上一篇:go  Canonical面向Ubuntu 16.04 LTS发布首批内核安全修复补丁
  下一篇:go  使用数据集成同步phoenix数据