ECMAScript Function-objekt (klass)
- Föregående sida arguments-objektet
- Nästa sida Kapsling (closure)
ECMAScript 的函数实际上是功能完整的对象。
Function 对象(类)
ECMAScript 最吸引人的可能是函数实际上是功能完整的对象。
Function 类可以表示开发者定义的任何函数。
语法用于直接创建函数的 Function 类如下:
var function_name = new function()arg1, arg2, ... , argN, function_body)
I detta format är varje arg är en parameter, den sista parameteren är funktionens huvud (den kod som ska köras). Dessa parametrar måste vara strängar.
Kom ihåg denna funktion?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
kan definieras på följande sätt:
var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
Trots att det är något svårt att skriva på detta sätt på grund av strängarna, hjälper det till att förstå att funktioner bara är en typ av referens, och de beter sig på samma sätt som funktioner som skapas med Function-klassen.
Se detta exempel:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //Utskrivning "20"
Som du vet har den andra funktionen överskrivit den första funktionen, så att doAdd(10) skriver ut "20" istället för "30".
Om man skriver om detta kodblock på följande sätt, blir konceptet tydligare:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
Observera detta kodsegment, det är uppenbart att värdet för doAdd har ändrats till att peka på en annan objektpekare. Funktionsnamnet är bara en referens till funktionen och beter sig som andra objekt. Man kan till och med få två variabler att peka på samma funktion:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //Utskrivning "20" alsodoAdd(10); //Utskrivning "20"
Här definieras variabeln doAdd som en funktion, och sedan deklarerades alsodoAdd som en pekare som pekar på samma funktion. Båda variablerna kan användas för att köra koden för funktionen och generera samma resultat - "20". Därför kan man passera en funktion som parameter till en annan funktion om funktionens namn bara pekar på funktionen?
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //Output "20"
I det ovanstående exemplet har callAnotherFunc() två argument - den funktion som ska anropas och argumenten som ska överföras till den funktionen. Detta kodexempel skickar doAdd() till callAnotherFunc() -funktionen, med 10 som argument, och output "20".
Observera:Trots att du kan använda Function-konstruktören för att skapa funktioner, är det bättre att inte använda den eftersom det tar mycket längre tid att definiera en funktion på detta sätt än på traditionellt sätt. Men alla funktioner bör betraktas som instanser av Function-klassen.
Function-objektets length-egenskap
Som tidigare nämnt är funktioner referenstyper, så de har också egenskaper och metoder.
ECMAScript definierar egenskapen length för att ange det förväntade antalet argument för en funktion. Till exempel:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //Output "1" alert(sayHi.length); //Output "0"
Funktionen doAdd() definierar ett argument, så dess length är 1; sayHi() definierar inga argument, så length är 0.
Kom ihåg att ECMAScript kan acceptera ett obegränsat antal argument (max 25), vilket beskrivs i kapitlet 'Översikt över funktioner'. Egenskapen length erbjuder ett enkelt sätt att se förväntat antal argument i standardfallet.
Function-objektets metoder
Function-objektet har också de metoder som delas av alla objekt, valueOf() och toString(). Dessa metoder returnerar alltid källkoden för funktionen, vilket är särskilt användbart vid debuggning. Till exempel:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
Ovanstående kod skriver ut texten för doAdd() -funktionen.Prova själv!
- Föregående sida arguments-objektet
- Nästa sida Kapsling (closure)