JavaScript/Objekte/Function: Unterschied zwischen den Versionen

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche
K (Constructor: Fixing links to disambiguation pages, replaced: d.h. → d. h.)
 
Zeile 1: Zeile 1:
Über das '''Function'''-Objekt haben Sie Zugriff auf Eigenschaften einer JavaScript-[[JavaScript/Funktion|Funktion]]. JavaScript-Funktionen werden dadurch also selbst Gegenstand von JavaScript-Anweisungen. Sinnvoll ist das Arbeiten mit dem Function-Objekt beispielsweise im Zusammenhang mit einer variablen Anzahl von Parametern in einer Funktion.
+
In JavaScript sind [[JavaScript/Funktion|Funktionen]] keine spezielle Sprachkonstruktion, sondern ganz normale [[JavaScript/Tutorials/OOP|Objekte]]. Sie haben Eigenschaften und Methoden, sie haben einen Prototypen und es gibt auch eine Konstruktorfunktion, um neue Funktionen zu erzeugen und um das Prototypobjekt bereitzustellen.
 +
 
 +
Das '''Function'''-Objekt stellt die Konstruktorfunktion für alle Funktionen in JavaScript dar. Man kommt nur in Ausnahmefällen in direkten Kontakt damit; normalerweise werden Sie nur die von <code>Function.prototype</code> bereitgestellten Methoden <code>apply</code>, <code>call</code> und <code>bind</code> benötigen. Um neue Funktionen zu erzeugen, werden Sie normalerweise nicht die <code>Function</code>-Konstruktorfunktion verwenden. JavaScript stellt dafür einfachere und auch schnellere Alternativen bereit.
  
 
{{2Spalten|
 
{{2Spalten|
 
'''Eigenschaften''':
 
'''Eigenschaften''':
 +
*[[JavaScript/Objekte/Function/length|length]]
 
*[[JavaScript/Objekte/Function/name|name]]
 
*[[JavaScript/Objekte/Function/name|name]]
 
*[[JavaScript/Objekte/Function/prototype|prototype]]
 
*[[JavaScript/Objekte/Function/prototype|prototype]]
 
|
 
|
'''Methoden''':
+
'''Methoden von Function.prototype''':
*[[JavaScript/Objekte/Function/apply|prototype.apply]]
+
*[[JavaScript/Objekte/Function/apply|apply]]
*[[JavaScript/Objekte/Function/bind|prototype.bind]]
+
*[[JavaScript/Objekte/Function/bind|bind]]
*[[JavaScript/Objekte/Function/call|prototype.call]]
+
*[[JavaScript/Objekte/Function/call|call]]
*[[JavaScript/Objekte/Function/toString|prototype.toString]]
+
*[[JavaScript/Objekte/Function/toString|toString]]
 
}}
 
}}
  
== Constructor ==
+
== Konstruktor ==
Alle Funktionen, egal wie sie erzeugt wurden, sind Instanzen des '''Function-Konstruktors''' (<code>Function constructor</code>). Sie können daher auch direkt diesen Konstruktor aufrufen, um eine weitere Instanz zu erzeugen.  
+
Alle Funktionen, egal wie sie erzeugt wurden, sind Instanzen des '''Function-Konstruktors''' und erben daher die Methoden von <code>Function.prototype</code>. Sie können diesen Konstruktor auch direkt aufrufen, um aus JavaScript-Quellcode eine Funktion zu generieren.  
 +
 
 +
{{Beispiel|zeige=dummy|
 +
{{BeispielCode|<source lang="javascript">
 +
const summe = new Function("a", "b", "return a+b;")
 +
</source>}}}}
 +
 
 +
Die Konstruktorfunktion erwartet als Parameter ausschließlich Zeichenketten. Zunächst übergeben Sie die Namen der Parameter, die die Funktion erhalten soll, und als letztes den Quellcode für die Anweisungen, die in der Funktion ausgeführt werden sollen.
 +
 
 +
Sie können sich die Übergabe der Parameternamen an <code>Function</code> so vorstellen, dass diese Argumente durch ein Komma verbunden zu einer langen Zeichenkette zusammengesetzt werden. Das Ergebnis wird in die Klammern eingesetzt, die in einer Funktionsdeklaration die Parameter festlegen. Das bedeutet dann aber auch, dass Sie in einem Argument mehrere Parameter für die erzeugte Funktion festlegen können. Das nachfolgende Beispiel erzeugt die gleiche Funktion wie das vorige Beispiel!
  
 
{{Beispiel|zeige=dummy|
 
{{Beispiel|zeige=dummy|
 
{{BeispielCode|<source lang="javascript">
 
{{BeispielCode|<source lang="javascript">
new Function("Parametername1", "Parametername2", … , "Anweisungen")
+
const summe = new Function("a,b", "return a+b;")
 
</source>}}}}
 
</source>}}}}
  
Folgende Angaben sind möglich:
+
Es bedeutet auch, dass Sie Defaultwerte für Parameter angeben und sogar [[Destrukturierung]]en deklarieren können:
 +
 
 +
{{Beispiel|zeige=dummy|
 +
{{BeispielCode|<source lang="javascript">
 +
const formel1 = new Function("a, [b1, b2]", "c=9", "return a + b1*b2 + c;");
 +
const formelx = new Function("a, [b1", "b2], c=9", "return a + b1*b2 + c;");  // SO BITTE NICHT
 +
 
 +
// Äquivalente Definition:
 +
function formel2(a, [b1, b2], c=9) {
 +
  return a + b1*b2 + c;
 +
}
 +
 
 +
console.log(formel1(4, [ 2, 3 ]);  // ergibt 4+2*3+9=19
 +
</source>}}}}
 +
 
 +
Die Funktion, die an <code>formelx</code> zugewiesen wird, würde ebenfalls funktionieren. Das Zerreißen des Destrukturierungsparameters <code>[b1, b2]</code> beeinträchtigt aber die Lesbarkeit und sollte daher unterlassen werden.
 +
 
 +
Die übergebenen Parameternamen müssen gültige [[JavaScript/Bezeichner|Bezeichner]] sein.
 
*<code>Parametername</code>: Der erste, zweite, dritte und alle folgenden Parameter, bis auf den letzten, enthalten die Parameternamen der neuen Funktion – als Strings, oder eine durch Komma getrennte Liste von [[JavaScript/Bezeichner|Bezeichnern]] (z.&nbsp;B.: "x", "derWert", oder "a,b").  
 
*<code>Parametername</code>: Der erste, zweite, dritte und alle folgenden Parameter, bis auf den letzten, enthalten die Parameternamen der neuen Funktion – als Strings, oder eine durch Komma getrennte Liste von [[JavaScript/Bezeichner|Bezeichnern]] (z.&nbsp;B.: "x", "derWert", oder "a,b").  
 
*<code>Anweisungen</code>: d.&nbsp;h. den Funktionskörper. Dabei muss es sich ebenfalls um eine Zeichenkette handeln.  
 
*<code>Anweisungen</code>: d.&nbsp;h. den Funktionskörper. Dabei muss es sich ebenfalls um eine Zeichenkette handeln.  
  
 +
== Scope ==
 +
Grundsätzlich gilt, dass eine Funktion in dem [[Scope]] ausgeführt wird, in dem die definiert wird. Für Funktionen, die mit <code>new Function()</code> erzeugt wurden, gilt dies nicht, sie werden immer im globalen Scope ausgeführt.
  
Der Aufruf von <code>[[JavaScript/Operatoren/new|new]] Function(...)</code> erzeugt lediglich eine Funktion, speichert sie selbst aber noch nicht. Möchten Sie die erzeugte Funktion in einer lokalen Variable speichern, können Sie notieren:
+
{{Beispiel|
 +
{{BeispielCode|<source lang="javascript">
 +
const a = 3;
 +
 
 +
function test(a) {
 +
  return new Function("x", "return a+x");
 +
}
  
{{Beispiel|zeige=dummy|
+
const func77 = test(77);
{{BeispielCode|<source lang="javascript">
+
console.log(func77(3));
var quadrat = new Function(
+
// Ausgabe ist 6, nicht 80
// Name des ersten Parameters
 
"zahl",
 
// Funktionskörper mit Anweisungen
 
"window.alert('Das Quadrat der Zahl ' + zahl + 'lautet: ' + (zahl * zahl);"
 
);
 
// Aufruf der erzeugten Funktion
 
quadrat(5);
 
 
</source>}}}}
 
</source>}}}}
  
Diese recht umständliche Notationsweise macht nur dann Sinn, wenn Sie in Ihrem JavaScript-Programm JavaScript-Code als String gespeichert haben und eine Funktion daraus machen wollen. Dies kommt freilich nur in einigen Spezialanwendungen vor.
 
  
 
{{Kategorie|JavaScript}}
 
{{Kategorie|JavaScript}}
 
[[Kategorie:Objekt (JavaScript)]]
 
[[Kategorie:Objekt (JavaScript)]]

Aktuelle Version vom 12. Dezember 2023, 14:22 Uhr

In JavaScript sind Funktionen keine spezielle Sprachkonstruktion, sondern ganz normale Objekte. Sie haben Eigenschaften und Methoden, sie haben einen Prototypen und es gibt auch eine Konstruktorfunktion, um neue Funktionen zu erzeugen und um das Prototypobjekt bereitzustellen.

Das Function-Objekt stellt die Konstruktorfunktion für alle Funktionen in JavaScript dar. Man kommt nur in Ausnahmefällen in direkten Kontakt damit; normalerweise werden Sie nur die von Function.prototype bereitgestellten Methoden apply, call und bind benötigen. Um neue Funktionen zu erzeugen, werden Sie normalerweise nicht die Function-Konstruktorfunktion verwenden. JavaScript stellt dafür einfachere und auch schnellere Alternativen bereit.

Eigenschaften:

Methoden von Function.prototype:

Konstruktor

Alle Funktionen, egal wie sie erzeugt wurden, sind Instanzen des Function-Konstruktors und erben daher die Methoden von Function.prototype. Sie können diesen Konstruktor auch direkt aufrufen, um aus JavaScript-Quellcode eine Funktion zu generieren.

Beispiel
const summe = new Function("a", "b", "return a+b;")

Die Konstruktorfunktion erwartet als Parameter ausschließlich Zeichenketten. Zunächst übergeben Sie die Namen der Parameter, die die Funktion erhalten soll, und als letztes den Quellcode für die Anweisungen, die in der Funktion ausgeführt werden sollen.

Sie können sich die Übergabe der Parameternamen an Function so vorstellen, dass diese Argumente durch ein Komma verbunden zu einer langen Zeichenkette zusammengesetzt werden. Das Ergebnis wird in die Klammern eingesetzt, die in einer Funktionsdeklaration die Parameter festlegen. Das bedeutet dann aber auch, dass Sie in einem Argument mehrere Parameter für die erzeugte Funktion festlegen können. Das nachfolgende Beispiel erzeugt die gleiche Funktion wie das vorige Beispiel!

Beispiel
const summe = new Function("a,b", "return a+b;")

Es bedeutet auch, dass Sie Defaultwerte für Parameter angeben und sogar Destrukturierungen deklarieren können:

Beispiel
const formel1 = new Function("a, [b1, b2]", "c=9", "return a + b1*b2 + c;");
const formelx = new Function("a, [b1", "b2], c=9", "return a + b1*b2 + c;");   // SO BITTE NICHT

// Äquivalente Definition:
function formel2(a, [b1, b2], c=9) {
   return a + b1*b2 + c;
}

console.log(formel1(4, [ 2, 3 ]);   // ergibt 4+2*3+9=19

Die Funktion, die an formelx zugewiesen wird, würde ebenfalls funktionieren. Das Zerreißen des Destrukturierungsparameters [b1, b2] beeinträchtigt aber die Lesbarkeit und sollte daher unterlassen werden.

Die übergebenen Parameternamen müssen gültige Bezeichner sein.

  • Parametername: Der erste, zweite, dritte und alle folgenden Parameter, bis auf den letzten, enthalten die Parameternamen der neuen Funktion – als Strings, oder eine durch Komma getrennte Liste von Bezeichnern (z. B.: "x", "derWert", oder "a,b").
  • Anweisungen: d. h. den Funktionskörper. Dabei muss es sich ebenfalls um eine Zeichenkette handeln.

Scope

Grundsätzlich gilt, dass eine Funktion in dem Scope ausgeführt wird, in dem die definiert wird. Für Funktionen, die mit new Function() erzeugt wurden, gilt dies nicht, sie werden immer im globalen Scope ausgeführt.

Beispiel
const a = 3;

function test(a) {
   return new Function("x", "return a+x");
}

const func77 = test(77);
console.log(func77(3));
// Ausgabe ist 6, nicht 80