NEWS
Frage zu Funktionsdeklaration
-
Hallo
Ich habe eine für mich neue Syntax für einen Funktionsdeklaration beim googeln entdeckt und frage mich jetzt, ob es einen prinzipiellen Unterschied zwischen beiden Methoden gibt oder ob eine schneller als die andere, performanter oder was auch immer ist.
Den einzigen Unterschied den ich bisher festgestellt habe ist, dass die Deklaration mit "function" auh nach dem Aufruf kommen kann währen die mit "const" immer vor dem Aufruf deklariert sein muss.const summe = (x, y) => { return x+y; }; function summe2(x, y){ return x+y; } console.log(summe(5,4)); console.log(summe2(5,4));
Es kommt (bisher) immer das richtige Ergebnis raus.
-
@wolfgangfb
Auch wenn das eine nette Spielerei zu sein scheint: Ich würd‘s lassen und Funktionen „klassisch“ deklarieren.
Es liest sich einfacher. Und das reicht mir als Grund bereits völlig, denn Code muss vor allem les- und damit gut wartbar sein.
Selbst wenn das minimale Performancevorteile bringt: Man hüte sich vor unnötigen Optimierungen. Die bringen in der Regel mehr Ärger als Nutzen. -
@wolfgangfb sagte: die mit "const" immer vor dem Aufruf deklariert sein muss.
Man sollte Variablen und Funktionen immer vor ihrer Verwendung / ihrem Aufruf deklarieren, damit man dem Compiler einen unnötigen Durchlauf erspart. Mit
let
undconst
muss vor der Verwendung deklariert werden.@wolfgangfb sagte in Frage zu Funktionsdeklaration:
ob eine schneller als die andere, performanter
Das Compiler-Ergebnis wird wahrscheinlich identisch sein.
-
es gibt schon ein Unterschied zwischen den beiden Deklarationen.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions?retiredLocale=de
der wichtigste Unterschied ist der erste, das eine Arrow-Funktion keinen eigenen neuen Context oder Scope erzeugt. Das hilft insbesondere bei Callback oder bei Promise-Verwendung, das man bspw this nicht separat (per bind) übergeben muss.
Ich denke Performance macht es keinerlei Unterschied.
Function erzeugt ein eigenes (Function-) Objekt auf das man wieder Funktionen verwenden kann, was bei Arrow nicht geht.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function?retiredLocale=deAuch zwischen let und var gibt es einen Unterschied.
Bei var wird hoisting angewendet. dh alle var Deklarationen innerhalb eines Funktionsblocks werden eingesammelt und so getan als ob sie am Anfang schon gemacht worden sind.
Bei let gilt die Deklaration erst ab der Stelle wo sie tatsächlich auch steht.
Auch bei der Scope-Betrachtung gibt es einen Unterschied.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let?retiredLocale=de -
@oliverio sagte in Frage zu Funktionsdeklaration:
eine Arrow-Funktion keinen eigenen neuen Context oder Scope erzeugt
Wobei ich das nicht unbedingt als Vorteil sehe.
Wenn der Scope nicht mehr so klar ist, führt das (meiner Ansicht nach) gerne mal dazu, dass unerwünschte Seiteneffekte entstehen.
Bei uns gilt die Regel, den Scope so klein wie nur möglich zu halten. Darum meckert unsere statische Codeanalyse z.B. auch globale Variablen an und bricht dann Continuous-Integration ab. Ich weiß aber nicht, ob das hier vergleichbar ist - bin halt in JS noch nicht so fit.@oliverio sagte in Frage zu Funktionsdeklaration:
alle var Deklarationen innerhalb eines Funktionsblocks werden eingesammelt und so getan als ob sie am Anfang schon gemacht worden sind
Darum liebe ich mein Delphi Hier müssen alle Variablen im Kopf einer Methode deklariert werden.
Ich habe schon immer ein Problem mit "Variablen werden unmittelbar vor ihrer ersten Verwendung deklariert". Die tauchen dann später irgendwo auf und man muss die passende Deklaration erst suchen. -
@codierknecht sagte in Frage zu Funktionsdeklaration:
Darum liebe ich mein Delphi Hier müssen alle Variablen im Kopf einer Methode deklariert werden.
Du sprichst mir so sehr aus dem Herzen. Meine "Muttersprache" ist auch Delphi und ich liebe es, dass jeder noch so popelige Typecast immer explizit angegeben werden muss und jede Veriable ganz klar am Anfang definiert sein muss und ein Int ist ein Int wird nicht irgendwann zu einem String oder einem Array.