597
汽車大全
前端開發中的柯裏化
一、 定義
引用維基百科的定義:
在計算機科學中,柯裏化(英語: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