閱讀597 返回首頁    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數據