Dieser Artikel beschreibt im Detail verschiedene Methoden der gemeinsamen Funktionsdefinition in JavaScript und wird für Ihre Referenz mit Ihnen geteilt. Die spezifische Analyse ist wie folgt:
Schauen wir uns zunächst die vier häufigsten Funktionsdefinitionen in JavaScript an:
Die mit dem Funktionskonstruktor definierte Funktion ist der Code wie folgt:
var multiply = new Function ('x', 'y', 'return x * y;');Funktionserklärung ist diese Methode auch die häufigste:
Funktion multiplizieren (x, y) {return x * y;}Funktionsausdrücke, die als anonyme Funktion deklariert und dann einer Variablen zugeordnet sind, sind sehr häufig:
var multiply = function (x, y) {return x * y;}Funktionsausdruck, aber die Funktionserklärung ist eine benannte Funktion und hat dann einer Variablen einen Wert zugewiesen, der genauso aussieht:
var multiply = function multi (x, y) {return x * y;}Vergleichen wir zunächst den Funktionsnamen und die direkte Beziehung zwischen der der Funktion zugewiesenen Funktionsvariablen. Es ist wirklich ein bisschen ... um intuitiver zu sein, aus dem Beispiel 4 ist es gerade die Beziehung zwischen der Funktionsvariablenmultiplizierter und dem Funktionsnamen Multi:
Funktionsnamen können nicht geändert werden, im Gegenteil können Funktionsvariablen neu zugewiesen werden. Es sollte leicht zu verstehen sein, dass Funktionsvariablen neu zugewiesen werden können. In unserem vierten Beispiel, der gerade definierten Multiplikationsvariablen, ist sie nicht angenehm zu sehen und zu übertragen zu:
multiply = function (x, y) {return x + y;}Ich verwandelte mich sofort von der Multiplikation bis zur Addition. Es ist jedoch unmöglich, die Multi -Funktionsvariable zu ändern. Die Funktionsdefinition ist bereits vorhanden. Solange es noch seine Referenz behält, wird es sich nicht ändern. Es ist hier möglicherweise nicht leicht zu verstehen. Denken Sie zuerst so darüber nach und schauen Sie nach unten, und Sie sollten es langsam verstehen können.
Der Funktionsname kann nicht gleichzeitig außerhalb der Funktion verwendet werden, er ist nur innerhalb des Funktionskörpers sichtbar. Ein sehr einfaches Beispiel:
var foo = function bar () {alert ('Hallo');} foo (); // Eingabeaufforderung "Hallo" String Bar (); // einen Fehler ausführen, die Bar ist nicht definiertUnd natürlich ist die Bar hier in der Tat ein Funktionsname, aber sie kann wirklich nicht extern genannt werden. Zu diesem Zeitpunkt wird es auf jeden Fall Kinderschuhe geben, in denen gefragt wird, warum dieses Beispiel immer noch so gut erzogen aussieht, genau wie Beispiel 4, warum nicht die Methode von Beispiel 2 verwenden? Gute Frage, lassen Sie mich es langsam aufschlüsseln.
Wenn wir mit Beispiel 4 fortgesetzt werden, können wir sehen, dass der Funktionsname (multi) und die Funktionsvariable (Multiplizieren) nicht gleich sind, aber tatsächlich haben die beiden überhaupt keine Beziehung, sodass keine Konsistenz aufrechterhalten werden muss. Apropos, ich denke, die oben genannten vier Beispiele sollten auf 3 reduziert werden, und Beispiel 2 und Beispiel 4 sollten im Wesentlichen konsistent sein. Was, glaubst es nicht? Hehe, ich muss es in einer Stille halten ~ Lesen Sie weiter ~~
Wir fanden heraus, dass im Vergleich zu Beispiel 2 und Beispiel 4 nur weniger VAR -Funktionsvariablen sind, und im Vergleich zu Beispiel 3 gibt es nur weniger diesen Funktionsnamen. Aus der Perspektive des Phänomens sind die Essenz von Beispiel 2 und Beispiel 4 gleich, und die Beweise sind wie folgt:
Funktion foo () {} alert (foo); // fordert den Funktionsnamen auf, der "foo" var bar = foo; alarm (bar) enthält; // fordert den Funktionsnamen auf, der immer noch "Foo" enthält und keine Beziehung zu Bar hatEs ist in der Tat Ironclad? Ist es die Art und Weise, den obigen Code ähnlich wie Beispiel 2 in Kombination mit den Codes in Beispiel 4 zu schreiben? Richtig, das habe ich gerade gesagt, dass die beiden im Wesentlichen gleich sein sollten. Bei der Definition der Funktion in Fall 2 half uns die JS -Engine jedoch, etwas zu tun, wie z. Wir dachten, dass wir bei der Verwendung des Funktionsnamens tatsächlich die Funktionsvariablenvariable verwendet haben, sodass wir schwindelig waren.
Ein kleiner Unterschied, der hier erwähnt werden muss, besteht jedoch darin, dass die durch die Funktionserklärungsverfahren definierte Funktion von der Konstruktordeklaration oder der Funktionsausdruckserklärung unterscheidet. Die Funktionserklärungsmethode kann vor der Funktionsdefinition aufgerufen werden ... Ganz zu schweigen davon, schauen Sie sich einfach den Code an:
foo (); // Tipp FooTunction foo () {alert ('foo');} bar (); // Kumpel, es ist wirklich anders als im oben genannten, also zeig nicht. Ist das nicht ein Fehler? Eingabeaufforderung Balk ist nicht definiert var bar = function () {alert ('bar');}Lassen Sie uns über die vom Konstruktor erklärten Funktionen sprechen. Die deklarierten Funktionen erben nicht den Umfang des aktuell deklarierten Ortes. Sie werden standardmäßig nur einen globalen Bereich haben. Dies gilt jedoch für andere Funktionen für Funktionen wie folgt:
Funktion foo () {var hi = 'Hallo'; // return function () {// alert (hi); //}; Rückgabefunktion ('return hi;');} foo () (); // Für den Ausführungseffekt rennen und sehen Sie sich selbst.Es kann vorgestellt werden, dass die Ausführung der Funktion mithilfe der Konstruktorerklärung unweigerlich einen Fehler meldet, da die Variable HI nicht in ihrem Bereich befindet (d. H. Globaler Bereich).
Ein weiterer Punkt ist, dass die Leute oft sagen, dass die im Konstruktormodus deklarierten Funktionen ineffizient sind. Warum ist das? Heute habe ich aus dem Dokument gelernt, dass die auf die anderen drei Arten deklarierten Funktionen nur einmal analysiert werden. Tatsächlich existieren sie im Verschluss, aber das hängt nur mit der Bereichskette zusammen, und der Funktionskörper wird nur einmal analysiert. Die Konstruktor -Methode ist jedoch, dass jedes Mal, wenn eine Funktion ausgeführt wird, ihre Funktionskörper einmal analysiert wird. Wir können denken, dass die auf diese Weise deklarierte Funktion ein Objekt ist, das Parameter und Funktionskörper speichert. Jedes Mal, wenn es ausgeführt wird, muss es einmal analysiert werden und die Parameter und die Funktionsorganisation werden ausgeführt, was zwangsläufig ineffizient ist. Sie wissen nicht, wie man das spezifische Experiment durchführt?
Lassen Sie uns schließlich über etwas sprechen, auf das niemand Aufmerksamkeit schenkt. Wann scheint es wie die Art der Funktionserklärung, nicht das Lebensstil (es ist immer noch so geneigt, es einfach auszudrücken, wenn die Art von Beispiel 2 versehentlich zu einem anderen Weg wird):
Wenn es Teil des Ausdrucks wird, ist es wie Beispiel 3 und Beispiel 4.
Es ist nicht mehr das "Quellelement" des Skripts selbst oder die Funktion. Was ist das Quellelement? Das heißt, eine nicht abestete Aussage im Skript oder einer Funktionskörper, wie:
var x = 0; // Quellelement if (x == 0) {// Quellelement x = 10; // kein Quellelement, da es in der IF -Anweisungsfunktion boo () {} // kein Quellelement verschachtelt ist, da es in der IF -Anweisung} foo () {// Quellelement var y = 20 verschachtelt ist; // Quellelement -Funktionsfunktion bar () {} // Quellelement while (y == 10) {// Quellelementfunktion Blah () {} // kein Quellelement, da es in der while -Anweisung y ++ verschachtelt ist; // kein Quellelement, weil es in einer Weile verschachtelt ist}}Ich habe das Konzept der Quellelemente grob verstanden. Ich werde mit der Funktionserklärung fortfahren, die ich gerade erwähnt habe. Bitte siehe:
// Funktionserklärung Funktion foo () {} // Funktionxpression (Funktions bar () {}) // Funktionxpression x = Funktion Hallo () {} if (x) {// Funktion Ausdrucksfunktion World () {}} // Funktionsfunktion A () {// Funktionsfunktion B () {} if (0) {// Funktionsfunktionsfunktionsfunktion Funktionsfunktion FUNKTION FUNKTION FUNKTION C () {}}}} {{// Funktionsfunktionsfunktionsfunktion.Lassen Sie mich schließlich über mein eigenes Verständnis sprechen. Der Grund für die Unterscheidung zwischen Funktionserklärung und Nicht-Funktionserklärung ist, dass die Funktionsdefinition der Funktionserklärung im Voraus im Voraus deklariert wird, wenn die JS-Parsing-Engine sie ausführt. Das heißt, wie wir erst oben gesagt haben, kann es vor der Funktionsdefinition verwendet werden. Tatsächlich hat der Parsing -Motor ihn analysiert, bevor wir ihn verwenden. Die nicht funktionsfähige deklarative nicht funktionsfähige Deklaration der Expressionsfunktion definiert der JS-Parsing-Engine nur die von Var im Voraus deklarierte Variable. Zu diesem Zeitpunkt ist der variable Wert undefiniert, und die tatsächliche Zuordnung zu dieser Variablen befindet sich am tatsächlichen Ort des Code. Daher sind die oben genannten Fehler alle undefiniert. Die tatsächliche Variable wurde definiert, aber noch nicht zugewiesen. Der JS -Parsingmotor weiß nicht, dass es sich um eine Funktion handelt.
Ich glaube, dass die Beschreibung in diesem Artikel einen gewissen Referenzwert für das JavaScript -Webprogrammierdesign aller hat.