Dieses Beispiel zeigt, wie die Benennung von Variablen und Funktionen und deren Umfang in JavaScript wichtig ist. Betrachten Sie den folgenden Code ...
Also, was ist los?
Die innere Variable a
der function a()
gibt seine Art: function
Die globale Variable a
auf den Rückgabewert von function a()
eingestellt ist - aber die Funktion nicht alles zurückgeben, damit es undefined
automatisch wird Die Art der globalen function a()
ist immer noch durch den Wert a
'außerhalb' von sich selbst bestimmt (sozusagen) - undefined
N Oder die Reihenfolge, in der die Anrufe an console.log()
ankommen?
Nicht nur die inneren a
nicht mit var
eingestellt, automatisch im globalen Bereich platzieren, aber a = a()
bedeutet es nicht einmal mehr eine Funktion!
Es ist a = a()
, die a is not a function
TypeError verursacht.
Auf der anderen Seite, schauen, was passiert, wenn ich a =
entfernen, aber alles andere lassen, wie es ...
war
a();
console.log('typeof global variable a :',(typeof a));
function a() {
console.log('A');
a = function() {
console.log('B');
};
console.log('typeof global function a() inner function a() :',(typeof a));
}
console.log('typeof global function a() :',(typeof a));
a();
//=> A
//=> typeof global function a() inner function a() : function
//=> typeof global function a() : function
//=> typeof global variable a : function
//=> B
Sehen Sie, wie die Reihenfolge geändert hat?
Wir können jetzt nicht an 'globale Variable a' (wie zuvor) als Variable denken - die a
ist nur ein Token, das auf die Funktion zeigt.
function a()
genannt wird, löst das console.log(
A )
, setzt die Token a
(die selbst ist) an die neue Funktion, und dann löst das console.log(
B )
wenn erneut aufgerufen.
Es gibt ein bisschen mehr Details, die herausgefiltert werden können, und bessere Möglichkeiten, um das gleiche Ergebnis zu erzielen, aber die Aufrufe an die Konsole sind ein großer Hinweis auf das, was vor sich geht. Stellen Sie sich das Beispiel nicht als brauchbares Muster vor, sondern betrachten Sie es als etwas, das darauf hinweist, wie eine JavaScript-Engine das tut, was sie tut.
Sie können diesen Artikel von JavaScriptIsSexy.com nützlich finden: JavaScript Variable Scope and Hoisting Explained
so die richtige Sache sollte 'Return-Funktion sein() {alert ('B')}' davon statt. Also Fehler aus den Büchern ?? – xcode
Ja, das Zurückgeben der Funktion würde mit 'a = a()' funktionieren. Ich füge das meiner Antwort hinzu. – nnnnnn
Danke. Sehr klare und hilfreiche Antwort – xcode