因?yàn)镋CMAScript中的函數(shù)名本身就是變量,所以函數(shù)也可以作為值來(lái)使用。也就是說(shuō),不僅可以像傳遞參數(shù)一樣把一個(gè)函數(shù)傳遞給另一個(gè)函數(shù),而且可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回。來(lái)看一看下面的函數(shù):
function callSomeFunction (someFunction, someArgument){
return someFunction(someArgument);
}
南昌網(wǎng)站建設(shè)公司技術(shù)人員提示:這個(gè)函數(shù)接受兩個(gè)參數(shù)。第一個(gè)參數(shù)應(yīng)該是一個(gè)函數(shù),第二個(gè)參數(shù)應(yīng)該是要傳遞給該函數(shù)的一個(gè)值.然后就可以像下面的例子一樣傳遞函數(shù)了:
function add10(num){
return num+10;
}
var result1 = callSomeFunction(addl0, 10);
alert(resultl); //20
function getGreeting (name){
return "Hello,"+name;
}
var result2 = callSomeFunction (getGreeting,"Nicholas");
alert(result2); //"Hello,Nicholas"
這里的SomeFunction()函數(shù)是通用的,即無(wú)論第一個(gè)參數(shù)傳遞進(jìn)來(lái)的是什么函數(shù),它都會(huì)返回第一個(gè)參數(shù)后的結(jié)果。南昌網(wǎng)絡(luò)公司技術(shù)人員要提醒大家,還記得吧,要訪(fǎng)問(wèn)函數(shù)的指針而不執(zhí)行函數(shù)的話(huà),必須去掉函數(shù)名后面的那對(duì)圓括號(hào)。因此上面例子中傳遞給callSomeFunction()的是add10 和 getGreeting,而不是執(zhí)行它們之后的結(jié)果。
當(dāng)然,可以從一個(gè)函數(shù)中返回另一個(gè)函數(shù),而且這也是極為有用的一種技術(shù)。例如,假設(shè)有一個(gè)對(duì)象數(shù)組,我們想要根據(jù)某個(gè)對(duì)象屬性對(duì)數(shù)組進(jìn)行排序。而傳遞給數(shù)組sort()方法的比較函數(shù)要接收兩個(gè)參數(shù),即要比較的值??墒?,我們需要一種方式來(lái)指明按照哪個(gè)屬性來(lái)排序。要解決這個(gè)問(wèn)題,可以定義一個(gè)函數(shù),它接收一個(gè)屬性名,然后根據(jù)這個(gè)屬性名來(lái)創(chuàng)建一個(gè)比較函數(shù),下面就是這個(gè)函數(shù)的定義。
function createComparisonFunction( propertyName) {
return function (objectl,object2){
var valuel=objectl[propertyName];
var value2=object2[propertyName];
if (valuel return -1;
else if (valuel>value2){
return 1;
else {
return 0;
}
};
}
這個(gè)函數(shù)看起來(lái)有點(diǎn)復(fù)雜,但實(shí)際上無(wú)非就是在一個(gè)函數(shù)中嵌套了另一個(gè)函數(shù),而且內(nèi)部函數(shù)前面加了一個(gè)return操作符。在內(nèi)部函數(shù)接收到propertyName參數(shù)后,它會(huì)使用方括號(hào)表示法來(lái)取得給定屬性的值。取得了想要的屬性值之后,定義比較函數(shù)就非常簡(jiǎn)單了。上面這個(gè)函數(shù)可以像在下面例子中這樣使用:
var data= [{name: "Zachary", age: 28), tname: "Nicholas",age: 29}];
data. sort( createComparisonFunction("name"));
alert (data[data[0].name); //Nicholas
data. sort(createComparisonFunction("age"));
alert(data[O].name); //Zachary
這里,我們創(chuàng)建了一個(gè)包含兩個(gè)對(duì)象的數(shù)組data。其中,每個(gè)對(duì)象都包含一個(gè)name屬性和一個(gè)age屬性。在默認(rèn)情況下,sort()方法會(huì)調(diào)用每個(gè)對(duì)象的toString()方法以確定它們的次序;但得到的結(jié)果往往并不符合人類(lèi)的思維習(xí)慣。因此,我們調(diào)用createComparisonFunction(n name”)方法創(chuàng)建了一個(gè)比較函數(shù),以便按照每個(gè)對(duì)象的name屬性值進(jìn)行排序。而結(jié)果排在前面的第一項(xiàng)是name為”Nicholas”,age是29的對(duì)象。然后,我們又使用了createComparisonFunction(”age”)返回的比較函數(shù),這次是按照對(duì)象的age屬性排序。得到的結(jié)果是name值為”Zachary”,age值是28的對(duì)象排在了第一位。
希望對(duì)廣大站長(zhǎng)或網(wǎng)站建設(shè)公司或從事企業(yè)網(wǎng)站建設(shè)的團(tuán)隊(duì)有所幫助,如對(duì)此不太理解的,可以與南昌網(wǎng)絡(luò)公司百恒網(wǎng)絡(luò)技術(shù)部聯(lián)系。我們很高與廣大站長(zhǎng)和網(wǎng)站建設(shè)公司技術(shù)人員分享我們的技術(shù)和經(jīng)驗(yàn)。