Gibt es einen funktionalen Grund für die Benennung der Funktion sowohl in der Variablendeklaration als auch im Funktionskonstrukt?
Ja. function bar() {}
bewirkt, dass die name
-Eigenschaft der Funktion auf bar
gesetzt wird, was zum Beispiel zum Debuggen in Stack-Traces nützlich sein kann.
einige der Namensgebung Verwirrung in Bezug auf die Sie erwähnt, könnte dies helfen:
function bar() {}
^Dies ist eine Funktionsdeklaration, wie es im Rahmen eines Zuweisungsausdruck existiert nicht.
var foo = function() {};
^Dies ist ein Zuweisungsausdruck wo der rechte Operand ist ein Funktionsausdruck , und wobei die Funktion Ausdruck definiert eine anonyme Funktion.
var foo = function bar() {};
^Dies ist ein Zuweisungsausdruck wo der rechte Operand ist ein Funktionsausdruck , und wobei die Funktion Ausdruck definiert eine benannte Funktion.
Es ist wahrscheinlich erwähnenswert, dass Funktionsdeklarationen kann lokal durch ihre Funktionsnamen referenziert werden, so dass die folgenden Aussagen sind grob äquivalent:
function bar() {}
var bar = function() {};
ich sagen grob äquivalent, da die zweite Aussage führt immer noch eine anonyme Funktion, anstatt eine namens Funktion. Es gibt auch einen kleinen Unterschied darin, wie Funktionsdeklarationen gehisst werden. Betrachten Sie die folgende, zum Beispiel:
function test() {
hello();
var hello = function() { console.log('hello'); };
}
test();
// > TypeError: hello is not a function
Beachten Sie, dass hello
technisch definiert wurde, wo wir es aufzurufen versucht (die Ausnahme einfach ist, dass es nicht eine Funktion (noch)).Dies ist auf das variable Heben zurückzuführen. Wie erwartet, haben wir jedoch unsere Funktion nicht der hello
Variable zugewiesen. Das ist leichter zu zeigen als wirklich zu erklären. Im Wesentlichen aufgrund des Hochziehens, das obigen test
Beispiel entspricht:
function test() {
var hello; // declared, but not assigned yet
hello();
hello = function() { console.log('hello'); }; // now the assignment happens
}
vergleichen, die zu einer tatsächlichen Funktionsdeklaration:
function test() {
hello();
function hello() { console.log('hello'); };
}
test();
// > "hello"
Beachten Sie, dass, obwohl die Erklärung unten der Aufrufbefehl, es funktioniert immer noch, weil Funktionsdeklarationen als Ganzes an die Spitze ihres Geltungsbereichs gehievt werden (in diesem Fall test
).
Wenn das verwirrend ist, ist hier eine verkürzte Beschreibung des Verhaltens, die helfen könnten: Erklärungen gehisst erhalten, nicht Zuweisungen. Solange Sie den Unterschied zwischen Funktionsdeklarationen und Funktionsausdrücken verstehen, ist dies alles, was Sie wissen müssen. :)
Ich bin übrigens nicht geschickt genug mit der Terminologie, aber vielleicht ist "Funktionskonstrukt" nicht das Richtige, um es zu nennen, ich hätte nichts dagegen, auch über diese Terminologie informiert zu werden. –