Was ist der Vorteil der Zuweisung einer Funktion zu einem var?

10

Angesichts dieses Javascript-Beispiels habe ich gefunden

var sum = function() {
  var i, sum = 0;
  for(i = 0; i < arguments.length; i += 1) {
    sum += arguments[i];
  }
  return sum;
};

Welchen Vorteil hat es, einer Var eine Funktion zuzuweisen?

Octopusgrabbus
quelle
stackoverflow.com/questions/336859
BlueRaja - Danny Pflughoeft

Antworten:

8

Die kurze Antwort, die ich glaube, ist einfach, dass Sie eine anonyme Funktion erstellen, die einer Variablen zugewiesen ist, anstatt eine benannte Funktion mit ...

    function sum() {}

Eine gute Möglichkeit, die Unterschiede zu überprüfen, besteht darin, .ToString () aufzurufen und den Unterschied zu sehen, oder Sie können console.log (sum.name) ausführen. Einer gibt einen tatsächlichen Namen und der andere nichts, nämlich die anonyme Funktion (die dem var zugewiesene). Es gibt auch Besonderheiten, wie die var sum = function () {} zur Laufzeit definiert wird und die function sum () {} zur Analysezeit definiert wird.

harmonischer Schlüssel
quelle
Was ich mit dem letzten Satz meine, ist, dass es einen Fehler geben würde, wenn Sie versuchen würden, sum () in einer vorherigen Zeile oben aufzurufen, wo es durch var definiert wurde. Wenn es wie in meiner Antwort definiert ist, würde es keinen Fehler geben, selbst wenn der Aufruf über der Funktion wäre.
Harmonickey
12
Das erklärt den Unterschied , aber ich denke nicht, dass es den Vorteil erklärt .
Keith Thompson
Was ist der Unterschied zwischen Analysezeit und Laufzeit?
Wern Ancheta
1
Hat nichts mit benannten Funktionen zu tun, Sie können einer Variablen trotzdem eine benannte Funktion zuweisen
Juan Mendes
5

Ein Vorteil ist, dass Sie keine Funktionsdeklaration in einem Block verwenden können. Sie können sich nur auf der obersten Ebene einer Datei oder direkt in einer anderen Funktion befinden.

if (true) {
  function foo() {}
}
try {
  function foo(){}
}
switch (true) {
  default:
    function foo(){}
}

Diese sind alle vom Standard nicht spezifiziert und Browser führen unterschiedliche Aktionen aus, siehe /programming/10069204/function-declarations-inside-if-else-statements . Wenn Sie also manchmal den anderen Stil verwenden müssen, möchten Sie dies aus Gründen der Konsistenz möglicherweise immer tun

Ich bin mir auch nicht sicher, aber wenn ich mich richtig erinnere, waren einige alte Minifizierer nicht klug genug, um Funktionsdeklarationen zu verarbeiten und sie nicht umzubenennen.

Austin
quelle
3

Ich bin kein Javascript-Experte, also nimm das mit einem Körnchen Salz. Ich denke, in einigen Fällen könnten die Leute es aus Stilgründen tun und dasselbe könnte erreicht werden, indem einfach "function sum () {...}" geschrieben wird.

Das Zuweisen einer Funktion zu einer Variablen ist jedoch eine sehr leistungsfähige Technik in der funktionalen Programmierung. Wenn Sie mit OOP vertraut sind, ähnelt es dem Polymorphismus. Denken Sie an das klassische Beispiel der Basisklasse Tier und der Klasse Katzen / Hund. Sie können Code schreiben, der mit Animal funktioniert. Wenn jedoch eine Funktion aufgerufen wird, kann diese Funktion je nach Instanztyp unterschiedliche Aufgaben ausführen.

In der funktionalen Programmierung könnten Sie einen Algorithmus haben, der mit "einer Funktion" arbeitet. Wenn Sie jedoch eine Variable zum Aufrufen dieser Funktion verwenden, haben Sie die Flexibilität, zur Laufzeit eine andere Funktion zuzuweisen.

Angenommen, Sie schreiben einen Algorithmus, um 10.000 Datenpunkte in einem Fenster mit einem Durchmesser von nur 500 Pixel darzustellen. Jedes Pixel repräsentiert dann 20 Datenpunkte. Um sie darzustellen, müssen Sie diese 20 Datenpunkte zu einem einzigen Wert zusammenfassen.

Angenommen, Sie definieren einen Algorithmus zur Darstellung der 10.000 Punkte, und dieser Algorithmus verwendet eine Funktionsvariable namens Aggregat wie folgt:

...
displayValue = aggregate( numbersInOnePixel );
...

Jetzt kann Ihr Benutzer zur Laufzeit auswählen, wie die Daten aggregiert werden sollen. Ihre tatsächliche Funktionsvariable kann eine der folgenden sein:

aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}
DXM
quelle
0

Es ist meistens eine Frage des Stils, da die einzigen Situationen, in denen sich der Unterschied zeigt (Aufrufen einiger Funktionen vor dem Beenden aller Deklarationen; Verwenden der toString-Methode), meiner Meinung nach Eckfälle sind.

Eines der Argumente, die ich gehört habe, um diesen var =Stil zu unterstützen, ist, dass er mit der Deklaration normaler Variablen übereinstimmt. Dies begrenzt die Anzahl der von Ihnen verwendeten Sprachfunktionen und macht es einfacher, Ihr Programm einer neuen Person in Javascript vorzustellen.

Hugomg
quelle