Funktionsdeklaration
function foo() {}
Funktion foo wird angehoben, bevor das gesamte Programm ausgeführt wird, sodass sie im gesamten Bereich verfügbar ist, in dem die Funktion foo definiert ist. Es gibt kein Problem, selbst wenn es aufgerufen wird, bevor die Funktion definiert ist.
foo(); // Works because foo was created before this code runs function foo() {}
Da ich vorhabe, einen speziellen Artikel über den Umfang zu schreiben, werde ich hier nicht auf Details eingehen.
Funktionsausdruck
Für Funktionsdeklarationen ist der Name der Funktion erforderlich, für Funktionsausdrücke ist er jedoch optional. Daher werden anonyme Funktionsausdrücke und benannte Funktionsausdrücke angezeigt. Wie folgt:
Funktionsdeklaration: function functionName (){ }
Funktionsdeklaration: function functionName[optional](){ }
Dann weiß ich, dass es sich um einen Funktionsausdruck handeln muss, wenn kein Funktionsname vorhanden ist. Wie kann ich jedoch beurteilen, ob ein Funktionsname vorhanden ist?
Javascript legt fest, dass es sich um einen Funktionsausdruck handelt, wenn der gesamte Funktionskörper Teil eines Ausdrucks ist, andernfalls um eine Funktionsdeklaration. Das Folgende ist der Ausdruck:
var fuc = foo(){}
Lassen Sie uns noch ein paar extreme Ausdrucksbeispiele nennen:
!function foo(){} true && function foo(){}
Die obige Anweisung dient nur zur Unterscheidung von Funktionsausdrücken und wird im Allgemeinen nicht so geschrieben. Dann nutzen Sie ein Vergleichsbeispiel, um den Effekt zu sehen:
foo1();//foo1 is not defined foo2();//works because foo2 was created before this code runs !function foo1() { alert('foo1 works'); }; function foo2() { alert('foo2 works'); };
Anonymer Funktionsausdruck
var foo = function() {};
Das obige Beispiel weist der Variablen foo eine anonyme Funktion zu.
foo; // 'undefined' foo(); // this raises a TypeError var foo = function() {};
Da var eine Deklaration ist, wird die Variable foo hier angehoben, sodass die Variable foo bei der Ausführung des Programms aufrufbar ist.
Da die Zuweisungsanweisung jedoch erst zur Laufzeit wirksam wird, ist der Wert der Variablen foo undefiniert.
Benannter Funktionsausdruck
Ein weiterer Diskussionspunkt ist die Zuweisung benannter Funktionen.
var foo = function bar() { bar(); // Works }; bar(); // ReferenceError
Hier wird die benannte Funktion bar der Variablen foo zugewiesen, sodass sie außerhalb der Funktionsdeklaration nicht sichtbar ist, aber dennoch innerhalb der bar-Funktion aufgerufen werden kann. Dies liegt an der Art und Weise, wie Javascript benannte Funktionen verarbeitet. Der Name einer Funktion ist im Gültigkeitsbereich innerhalb der Funktion immer gültig.