簡體   English   中英

將嵌套函數作為參數傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM