Ich bin neu in Javascript und habe verwirrt, wie die Funktionsdeklaration funktioniert. Ich habe einige Test auf, dass und bekam einige interessante Ergebnisse:Mehrdeutige Funktionsdeklaration in Javascript
say();
function say()
{
alert("say");
}
Die Vorwärts-Deklaration gearbeitet und Pop-up „sagen“
Auf der gegenüberliegenden
say();
say = function()
{
alert("say");
}
nicht funktioniert, obwohl es auch deklariert ein Funktionsobjekt
Wenn wir die Funktion deklarieren und später deklarieren:
function say()
{
alert("speak");
}
say();
function say()
{
alert("say");
}
Ich habe "sagen" statt "sprechen". Das ist Überraschung!
OK. Es scheint, dass nur die letzte Funktionsdeklaration funktioniert. Dann läßt erstes Funktionsobjekt deklariert und dann eine „normale“ Funktion:
say = function()
{
alert("speak");
}
say();
function say()
{
alert("say");
}
say();
Eine weitere Überraschung war es „sprechen“, gefolgt von „sprechen“. Die Deklaration der "regulären" Funktion hat überhaupt nicht funktioniert!
Gibt es eine Erklärung von allen? Und wenn die "normale" Funktionsdeklaration wirklich so "zerbrechlich" ist und leicht vom gleichnamigen Funktionsobjekt überschrieben werden kann, sollte ich davon Abstand halten?
Eine andere Frage ist: mit nur dem Funktionsobjekt-Format, wird diese Vorwärtsdeklaration unmöglich? Gibt es eine Möglichkeit, das in Javascript zu "simulieren"?
Ich sehe deine Punkte. Aber was ist der Umfang, wenn ich lokale Funktionsobjekte definiere? Ich versuchte zu rufen window.say() und das Ergebnis ist immer noch nicht, was ich erwartet hatte:
function say() { alert("say"); } window.say();
wird Popup „sagen“ undvar say = function() { alert("speak"); } window.say(); function say() { alert("say"); } window.say();
wird Popup „sprechen“ zweimal. Bedeutet das, dass sowohl die "globale" Funktion als auch das "lokale" Objekt Mitglieder des Fensterobjekts sind? –Entschuldigung, ich weiß nicht, wie man den Kommentar formatiert ... :( –
@Xiang: Der Grund, warum Sie zweimal "sprechen", ist, dass der JavaScript-Interpreter zwei Durchgänge durchführt: in der ersten erstellt es Eigenschaften des Objekts Variable (die verwendet wird, um Variablen im aktuellen Bereich nachzuschlagen und ist das globale Objekt im globalen Code) für 'var' Anweisungen und Funktionsdeklarationen, und im zweiten Durchlauf führt sie die Anweisungen der Reihe nach aus. Entscheidend ist, dass 'var' Anweisungen werden effektiv in zwei geteilt: Im ersten Durchgang wird eine Eigenschaft mit dem Wert "undefiniert" zum Variablenobjekt hinzugefügt, wenn sie nicht bereits eine Eigenschaft mit diesem Namen enthält (Fortsetzung ...) –