JavaScript 中的函数组合
Function composition in JavaScript
下划线、lo-dash 等库中的函数组合实现有什么好处,类似于这个:
var compose = function() {
var funcs = arguments;
return function() {
var args = arguments;
for (var i = funcs.length; i --> 0;) {
args = [funcs[i].apply(this, args)];
}
return args[0];
}
};
var c = compose(trim, capitalize);
与此相比:
var c = function (x) { return capitalize(trim(x)); };
后者性能更高。
一方面,它更易于阅读。性能很少比这更重要。此外,您可以制作具有几乎相同性能的专用 arity 2 函数。
另一个好处是可以在运行时轻松更改组合。您可以创建 trim 前大写、trim 前大写、仅 trim、仅大写或两者都不大写的版本,而无需在代码中明确指定每个组合。有时这可以大大简化您的代码。运行时组合是您一直想要的东西之一。
例如:
var c = function(x) {return x;} // identity
var onTrimClick = function() {c = compose(c, trim);}
var onCapitalizeClick = function() {c = compose(c, capitalize);}
var onSomethingElseClick = function() {c = compose(c, somethingElse);}
这让您可以在运行时根据用户点击的内容和顺序创建组合函数 c
。
//A simple way to understand javascript function composition =>
function composition(...fun) {
return function (value) {
var functionList = fun.slice();
while (functionList.length > 0) {
value = functionList.pop()(value);
}
return value;
}
}
function mult2(value) {
return value * 2;
}
function mult3(value) {
return value * 3;
}
function mult5(value) {
return value * 5;
}
var composedFun = composition(mult2, mult3, mult5);
console.log(composedFun);
console.log(composedFun(1));
console.log(composedFun(2));
下划线、lo-dash 等库中的函数组合实现有什么好处,类似于这个:
var compose = function() {
var funcs = arguments;
return function() {
var args = arguments;
for (var i = funcs.length; i --> 0;) {
args = [funcs[i].apply(this, args)];
}
return args[0];
}
};
var c = compose(trim, capitalize);
与此相比:
var c = function (x) { return capitalize(trim(x)); };
后者性能更高。
一方面,它更易于阅读。性能很少比这更重要。此外,您可以制作具有几乎相同性能的专用 arity 2 函数。
另一个好处是可以在运行时轻松更改组合。您可以创建 trim 前大写、trim 前大写、仅 trim、仅大写或两者都不大写的版本,而无需在代码中明确指定每个组合。有时这可以大大简化您的代码。运行时组合是您一直想要的东西之一。
例如:
var c = function(x) {return x;} // identity
var onTrimClick = function() {c = compose(c, trim);}
var onCapitalizeClick = function() {c = compose(c, capitalize);}
var onSomethingElseClick = function() {c = compose(c, somethingElse);}
这让您可以在运行时根据用户点击的内容和顺序创建组合函数 c
。
//A simple way to understand javascript function composition =>
function composition(...fun) {
return function (value) {
var functionList = fun.slice();
while (functionList.length > 0) {
value = functionList.pop()(value);
}
return value;
}
}
function mult2(value) {
return value * 2;
}
function mult3(value) {
return value * 3;
}
function mult5(value) {
return value * 5;
}
var composedFun = composition(mult2, mult3, mult5);
console.log(composedFun);
console.log(composedFun(1));
console.log(composedFun(2));