javascript,將一個函數作為另一個函數的返回值。


假設我們用一個數組保存一組學生的基本信息。

var studentsData = 
    [{name:"mike",age:17},
     {name:"loren",age:16},
     {name:"frank",age:18}];

現在,我們需要對這個數組按照姓名(name)字段進行升序排序,在這個場景內,使用數組的sort(compareFunction)方法進行排序,該方法的參數是一個比較函數。

比較函數接收兩個參數,如果第一個參數應該位於第二個之前則返回一個負數,如果兩個參數相等則返回0,如果第一個參數應該位於第二個之后則返回一個正數。

以下為按照name字段進行排序:

function compareFunctionByName(object1,object2){
    var value1=object1["name"];
    var value2=object2["name"];
    if(value1<value2){
        return -1;
    }else if(value1==value2){
        return 0;
    }else{
        return 1;
    }    
};


studentsData.sort(compareFunctionByName);

結果:

frank
loren
mike

 

這樣的排序寫法簡單有效,但是,如果此時需求變更,除了name外還需要對學生的age進行排序時,一般的做法是另外寫一個按照age字段進行排序的比較函數,然后在調用的地方作個條件判斷,決定使用哪一個版本的比較函數。

新增加版本的比較函數如下:

function compareFunctionByAge(object1,object2){
    var value1=object1["age"];
    var value2=object2["age"];
    if(value1<value2){
        return -1;
    }else if(value1==value2){
        return 0;
    }else{
        return 1;
    }    
};

上面的寫法工作的很好,但是兩個版本的比較函數除了比較字段的不同外,其余部分均相同,如果又增加了對其他字段進行排序需求的話,代碼的冗余度大大增加,而且代碼會越來越丑陋。

 

當這種場景發生時,我們就需要用到js函數中一個非常有用的特性:將一個函數作為另一個函數的返回值。

具體作法,寫一個生成函數,該生成函數根據字段名生成相應版本的比較函數,並將比較函數返回作為sort方法的參數。

如下:

function createCompareFunction(fieldName){
    return function(object1,object2){
        var value1=object1[fieldName];
        var value2=object2[fieldName];
        if(value1<value2){
            return -1;
        }else if(value1==value2){
            return 0;
        }else{
            return 1;
        }    
    };
}

//按照name字段進行排序
studentsData.sort(createCompareFunction("name"));

//按照age字段進行排序
studentsData.sort(createCompareFunction("age"));

如此便解決了高冗余度的問題,並且通用性良好。

 

javascript函數的這一特性在實際中應用點很多,繼續挖掘中。。。

^_^。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM