是否有嵌套函数的方式并将它们作为参数传递? 我有这两个功能:
function mayus(string) {
return string.toUpperCase();
}
function removeA(string) {
return string.replace(/A/g, "");
}
我希望以两种不同的方式应用它们
function stringHandler1(stringID) {
var newString = mayus(removeA(getString(stringID)));
return newString;
}
function stringHandler2(stringID) {
var newString = removeA(mayus(getString(stringID)));
return newString;
}
2个stringHandlers返回略有不同的字符串,但它们非常相似。有没有办法使用一个带有2个参数的字符串处理程序(stringID和操作)
function stringHandlerINeed(string, operation) {
var newString = operation(string);
alert(newString);
}
我想做点什么
stringHandlerINeed(" 516af2",mayus(removeA))
更新 我标记了jJ'作为答案,因为它并不要求我改变我已经拥有的任何功能,而且它是我所寻找的概念,但是juvian的this answer如此简单让我希望我我想出来了。
答案 0 :(得分:4)
我能想到的最好的方法是根据操作的顺序在数组中发送函数,然后一次评估每个函数:
function stringHandlerINeed(string, operation) {
var newString=string;
for(var i =0; i< operation.length;i++){
newString=operation[i](newString);
}
alert(newString);
}
stringHandlerINeed("516af2", [mayus,removeA]) // alerts 516F2
答案 1 :(得分:2)
你真正想要的可能是功能组合 ......实现它的一种方法是:
function compose() {
var fns = Array.prototype.slice.call(arguments);
return function (arg) {
fns.forEach(function (fn) {
arg = fn(arg);
});
return arg;
};
}
compose(mayus, removeA)('axA'); // -> "X"
compose(removeA, mayus)('axA'); // -> "AX"
这个概念有无穷无尽的应用。您可以使用compose
中链接的任意数量的函数。您可以命名组合函数:
var mayusRemoveA = compose(mayus, removeA);
您还可以创建一个常量函数(类似于上面的处理程序)而不是通过直接调用组合函数来计算的值...
var theHandlerINeed = compose(function () { return 'axA'; }, mayus, removeA);
theHandlerINeed(); // -> "X"
答案 2 :(得分:1)
我和juvian的方向相同,但更简单。
在这个jsfiddle(http://jsfiddle.net/4J2AH/)中,我传入了我想要操作的字符串和函数,然后执行这些操作并返回新字符串。
stringHandlerINeed("516af2", mayus(removeA))
的问题是,当你调用mayus(removeA)时,这意味着你实际上正在调用传入另一个函数的mayus函数。当它转到大写一个函数时,javascript会抛出一个错误。