[英]Pass a nested function as a parameter
有沒有辦法將嵌套函數傳遞給它們作為參數? 我有這兩個功能:
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返回的字符串略有不同,但是它們非常相似。 有沒有一種方法可以使用一個帶兩個參數的字符串處理程序(stringID和操作)
function stringHandlerINeed(string, operation) {
var newString = operation(string);
alert(newString);
}
我想做類似的事情
stringHandlerINeed(“ 516af2”,mayus(removeA))
更新:我將jJ'標記為答案,因為它不需要我更改我已經擁有的任何功能,這是我一直在尋找的概念,但是juvian的答案非常簡單,我希望我能提出用它。
我能想到的最好方法是根據操作順序將函數發送到數組中,然后一次評估每個函數:
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
您真正想要的可能是函數組合 ...實現它的一種方法是這樣的:
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"
我朝着Juvian的方向走,但更簡單。
在此jsfiddle( http://jsfiddle.net/4J2AH/ )中,我傳入了要操作的字符串和函數,然后執行了這些操作並返回了新的字符串。
stringHandlerINeed("516af2", mayus(removeA))
在於,當您調用mayus(removeA)時,這意味着您實際上是在調用傳遞另一個函數的mayus函數。 大寫一個函數時,javascript將引發錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.