ECMAScript-Function-Objekt (Klasse)
- Vorherige Seite arguments-Objekt
- Nächste Seite Schließung (closure)
Die Funktionen in ECMAScript sind tatsächlich vollständige Objekte.
Function-Objekt (Klasse)
Was ECMAScript am spannendsten macht, ist vielleicht, dass Funktionen tatsächlich vollständige Objekte sind.
Die Function-Klasse kann jede durch den Entwickler definierte Funktion darstellen.
Die Syntax zum direkten Erstellen einer Funktion mit der Function-Klasse ist wie folgt:
var function_name = new function()arg1, arg2, ... , argN, function_body)
In dieser Form ist jeder arg alle sind Parameter, der letzte Parameter ist der Funktionskörper (der ausgeführte Code). Diese Parameter müssen Strings sein.
Denken Sie sich diese Funktion noch einmal vor?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
Es kann auch so definiert werden:
var sayHi = new Function("sName", "sMessage", "alert("Hello " + sName + sMessage);");
Obwohl diese Form aufgrund der Strings etwas schwierig zu schreiben ist, hilft sie dabei zu verstehen, dass Funktionen nur Referenztypen sind und dass ihr Verhalten dem von Funktionen, die mit Function-Klasse explizit erstellt werden, entspricht.
Sehen Sie sich das folgende Beispiel an:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //Ausgabe "20"
Wie Sie wissen, überschreibt die zweite Funktion die erste Funktion, so dass doAdd(10) "20" und nicht "30" ausgibt.
Wenn Sie diesen Codeblock in dieser Form neu schreiben, wird das Konzept klarer:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
Beobachten Sie dieses Code-Segment, es ist offensichtlich, dass der Wert von doAdd auf einen Zeiger zu einem anderen Objekt geändert wurde. Der Funktionsname ist nur ein Verweis auf den Funktionsobjekt, und er verhält sich wie andere Objekte. Man kann sogar zwei Variablen auf denselben Funktionspunkt verweisen:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //Ausgabe "20" alsodoAdd(10); //Ausgabe "20"
Hier wird die Variable doAdd als Funktion definiert und dann als Zeiger auf denselben Funktionspunkt als alsdoAdd deklariert. Mit beiden Variablen kann der Funktionscode ausgeführt und dasselbe Ergebnis - "20" - ausgegeben werden. Daher kann eine Funktion als Parameter an eine andere Funktion weitergegeben werden, wenn der Funktionsname nur auf den Variablenpunkt der Funktion verweist? Die Antwort ist eindeutig ja!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); // Ausgabe "20"
Im obigen Beispiel hat callAnotherFunc() zwei Parameter - die zu aufrufende Funktion und die an die Funktion übergebenen Parameter. Dieses Codestück gibt doAdd() an callAnotherFunc() weiter und gibt als Parameter 10 an, die Ausgabe ist "20".
Hinweis:Obwohl man Funktionen mit dem Function-Konstruktor erstellen kann, ist es besser, dies nicht zu tun, da es viel langsamer ist, eine Funktion damit zu definieren als mit traditionellen Methoden. Allerdings sollten alle Funktionen als Instanzen der Function-Klasse betrachtet werden.
Die Eigenschaft length des Function-Objekts
Wie bereits erwähnt, gehören Funktionen zu den Referenztypen und haben daher auch Eigenschaften und Methoden.
Die Eigenschaft length, die von ECMAScript definiert wird, erklärt die Anzahl der erwarteten Parameter der Funktion. Zum Beispiel:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); // Ausgabe "1" alert(sayHi.length); // Ausgabe "0"
Die Funktion doAdd() definiert einen Parameter, daher beträgt ihre length 1; sayHi() definiert keine Parameter, daher ist length 0.
Denken Sie daran, dass ECMAScript unabhängig von der Anzahl der definierten Parameter beliebig viele Parameter akzeptieren kann (bis zu 25), was im Kapitel "Überblick über Funktionen" erläutert wurde. Das Attribut length bietet eine einfache Möglichkeit, die Anzahl der erwarteten Parameter in der Standardkonfiguration anzuzeigen.
Methoden des Function-Objekts
Der Function-Objekt hat auch Methoden, die mit allen Objekten gemeinsam genutzt werden, wie valueOf() und toString(). Diese Methoden geben immer den Quelltext der Funktion zurück und sind besonders nützlich bei der Fehlerbehebung. Zum Beispiel:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
Der obige Code gibt den Text der Funktion doAdd() aus.Probieren Sie selbst aus!
- Vorherige Seite arguments-Objekt
- Nächste Seite Schließung (closure)