几行代码了解JavaScript中的curring和uncurring
curry 柯里化
在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 – 维基百科
下面几行代码说明一下:
var curry = function(fn) {
var _args = [];
return function _f() {
if (arguments.length) {
Array.prototype.push.apply(_args, arguments);
return _f;
}
return fn.apply(this, _args);
}
}
// 累加方法
var add = curry(function() {
return Array.prototype.reduce.call(arguments, function(acc, cur) {
return acc + cur;
}, 0);
});
add(1)(2)(3)(); // 6
add(4)(); // 10
我们可以看到当参数为空时候就可以求出对应的值,也起到了一个惰性求值(延迟求值)的目的,在某些场景对性能提升有一定的帮助。
这个例子可能大家不太熟悉,下面这个例子大家应该都不陌生:
function add(a) {
return function (b) {
return a + b;
}
}
var add5 = add(5);
add5(10); // 15
add5(20); // 25
uncurry 反柯里化
反curring就是把原来已经固定的参数或者this上下文等当作参数延迟到未来传递。
Function.prototype.uncurry = function() {
var _this = this;
return function() {
return Function.prototype.call.apply(_this, arguments);
}
}
var obj = {};
var arr = [];
var push = Array.prototype.push.uncurry();
push(obj, 'hello', 'world'); // obj {0: "hello", 1: "world", length: 2}
push(arr, 'hello', 'world'); // arr ["hello", "world"]
About
个人网站:🔗microzz-IT技术分享
GitHub:🔗microzz