Frage

Mögliches Duplikat:
JavaScript:var functionName = function() {} vs function functionName() {}

Was ist in JavaScript der Zweck der Definition einer Variablen? als eine Funktion?Ich habe diese Konvention schon einmal gesehen und verstehe sie nicht ganz.

Irgendwann in einem Skript wird beispielsweise eine Funktion wie folgt aufgerufen:

whatever();

Aber wo würde ich eine Funktion mit dem Namen erwarten whatever, so was:

function whatever(){

}

Stattdessen sehe ich eine Variable namens whatever das ist als Funktion definiert, etwa so:

var whatever = function(){

}

Was ist der Zweck davon?Warum sollten Sie dies tun, anstatt nur die Funktion zu benennen?

War es hilfreich?

Lösung

Notiz:Bitte sehen Sie sich das Update am Ende der Antwort an. Deklarationen innerhalb von Blöcken wurden gültig (aber ziemlich kompliziert, wenn Sie nicht den strikten Modus verwenden).


Hier ist ein Grund:

var whatever;

if (some_condition) {
    whatever = function() {
        // Do something
    };
}
else {
    whatever = function() {
        // Do something else
    };
}
whatever();

Möglicherweise sehen Sie solchen Code bei der Initialisierung einer Bibliothek, die Implementierungsunterschiede verarbeiten muss (z. B. Unterschiede zwischen Webbrowsern, a'la IEs). attachEvent vs.Der Standard addEventListener).Mit einer Funktionsdeklaration können Sie das Äquivalent nicht erreichen:

if (some_condition) {
    function whatever() {    // <=== DON'T DO THIS
        // Do something
    }
}
else {
    function whatever() {    // <=== IT'S INVALID
        // Do something else
    }
}
whatever();

...sie sind nicht in Kontrollstrukturen spezifiziert, sodass JavaScript-Engines tun dürfen, was sie wollen, und verschiedene Engines haben unterschiedliche Dinge getan. (Bearbeiten:Siehe auch hier den Hinweis unten, sie sind jetzt spezifiziert.)

Unabhängig davon gibt es einen großen Unterschied zwischen

var whatever = function() {
    // ...
};

Und

function whatever() {
    // ...
}

Der erste ist ein Funktionsausdruck, und es wird ausgewertet, wenn der Code diesen Punkt in der schrittweisen Ausführung des Kontexts erreicht (z. B. die Funktion, in der er sich befindet, oder die schrittweise Ausführung von globalem Code).Es ergibt sich auch ein anonym Funktion (die darauf verweisende Variable hat einen Namen, die Funktion jedoch nicht, was Auswirkungen auf hat Helfen Sie Ihren Werkzeugen, Ihnen zu helfen).

Der zweite ist ein Funktionsdeklaration, und es wird beim Eintritt in den Kontext ausgewertet, Vor Jeder Schritt-für-Schritt-Code wird ausgeführt.(Einige nennen dies „Heben“, weil etwas weiter unten in der Quelle früher geschieht als etwas weiter oben in der Quelle.) Der Funktion wird auch ein richtiger Name gegeben.

Bedenken Sie also:

function foo() {
    doSomething();
    doSomethingElse();
    console.log("typeof bar = " + typeof bar); // Logs "function"

    function bar() {
    }
}

wohingegen

function foo() {
    doSomething();
    doSomethingElse();
    console.log("typeof bar = " + typeof bar); // Logs "undefined"

    var bar = function() {
    };
}

Im ersten Beispiel wird mit der Deklaration die Deklaration verarbeitet Vor Die doSomething und anderer schrittweiser Code wird ausgeführt.Im zweiten Beispiel, weil es ein ist Ausdruck, wird es als Teil des schrittweisen Codes ausgeführt und daher ist die Funktion oben nicht definiert (die Variable ist oben definiert, weil var wird auch „gehisst“).

Und zum Abschluss:Im Moment ist dies in allgemeinen clientseitigen Web-Sachen nicht möglich:

var bar = function foo() { // <=== Don't do this in client-side code for now
    // ...
};

Du sollen in der Lage sein, das zu tun, es heißt a benannter Funktionsausdruck und es ist ein Funktionsausdruck, der der Funktion einen richtigen Namen gibt.Aber verschiedene JavaScript-Engines haben zu unterschiedlichen Zeiten einen Fehler gemacht, und Der IE hat tatsächlich bis vor Kurzem immer wieder große Fehler gemacht.


Update für ES2015+

Ab ES2015 (auch bekannt als „ES6“) wurden der Spezifikation Funktionsdeklarationen innerhalb von Blöcken hinzugefügt.

Strikter Modus

Im strikten Modus ist das neu spezifizierte Verhalten einfach und leicht zu verstehen:Sie sind auf den Block beschränkt, in dem sie auftreten, und werden an die Spitze des Blocks gehoben.

Also das:

"use strict";
if (Math.random() < 0.5) {
  foo();
  function foo() {
    console.log("low");
  }
} else {
  foo();
  function foo() {
    console.log("high");
  }
}
console.log(typeof foo); // undefined

(Beachten Sie, wie die Aufrufe der Funktionen erfolgen über die Funktionen innerhalb der Blöcke.)

...ist im Wesentlichen äquivalent dazu:

"use strict";
if (Math.random() < 0.5) {
  let foo = function() {
    console.log("low");
  };
  foo();
} else {
  let foo = function() {
    console.log("high");
  };
  foo();
}
console.log(typeof foo); // undefined

Lockerer Modus

Das Verhalten im Loose-Mode ist viel komplexer und variiert darüber hinaus theoretisch zwischen JavaScript-Engines in Webbrowsern und JavaScript-Engines nicht in Webbrowsern.Ich werde hier nicht näher darauf eingehen.Tu es einfach nicht.Wenn Sie auf Funktionsdeklarationen innerhalb von Blöcken bestehen, verwenden Sie den strikten Modus, in dem sie sinnvoll und in allen Umgebungen konsistent sind.

Andere Tipps

Auf diese Weise können Sie Funktionen in Variablen speichern und z. B.Übergeben Sie sie als Parameter an andere Funktionen.Ein Beispiel, bei dem dies nützlich ist, ist das Schreiben asynchroner Funktionen, denen Rückrufe als Argumente übergeben werden

var callback = function() { console.log('done', result)}

var dosomething = function(callback) {
    //do some stuff here
    ...
    result = 1;
    callback(result);
}

Da Funktionen in Javascript Objekte sind, können Sie sie auch um Eigenschaften und Methoden erweitern.

Funktionen in JavaScript sind Objekte;Sie sind Werte, mit anderen Worten.So können Sie stets Legen Sie eine Variable fest, um auf eine Funktion zu verweisen, unabhängig davon, wie die Funktion definiert ist:

function foo() { ... }

var anotherFoo = foo;
anotherFoo(); // calls foo

Funktionen sind Werte, die als Objekteigenschaften, Funktionsparameter, Array-Elemente und alles andere, was ein allgemeiner Wert in JavaScript tun kann, verwendet werden können.Sie sind Objekte und können auch eigene Eigenschaften haben.

Wenn Sie einer Variablen eine Funktion zuweisen, können Sie sie als Argument an andere Funktionen weitergeben und sie auch erweitern, um das Objektmodell von Javascript zu nutzen.

Wenn Sie eine Funktionsvariable mit „var“ innerhalb einer Funktion deklarieren, ist die Variable kann nur innerhalb dieser Funktion aufgerufen werden.Wenn Sie die Funktion verlassen, wird die Variable zerstört.Diese Variablen werden lokale Variablen genannt.Sie können in verschiedenen Funktionen lokale Variablen mit demselben Namen haben, da jede nur von der Funktion erkannt wird, in der sie deklariert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top