/ / Mehrdeutige Funktionsdeklaration in Javascript - Javascript, Funktion, Deklaration, Forward-Deklaration

Mehrdeutige Funktionsdeklaration in Javascript - Javascript, Funktion, Deklaration, Vorwärtsdeklaration

Ich bin neu in Javascript und war verwirrt darüber, wie die Funktionsdeklaration funktioniert. Ich habe einige Tests gemacht und einige interessante Ergebnisse erzielt:

say();

function say()
{
alert("say");
}

Die Forward-Deklaration hat funktioniert und Popup "say"

Im Gegensatz

say();

say = function()
{
alert("say");
}

hat nicht funktioniert, obwohl es auch ein Funktionsobjekt deklariert

Wenn wir die Funktion deklarieren und anschließend neu deklarieren:

function say()
{
alert("speak");
}

say();

function say()
{
alert("say");
}

Ich habe "sagen" statt "sprechen". Das ist eine Überraschung!

IN ORDNUNG. Es scheint, dass nur die neueste Funktionsdeklaration funktioniert. Dann deklarieren wir zuerst das Funktionsobjekt und dann eine "reguläre" Funktion:

say = function()
{
alert("speak");
}

say();

function say()
{
alert("say");
}

say();

Eine weitere Überraschung war "sprechen", gefolgt von "sprechen". Die "reguläre" Funktionsdeklaration hat überhaupt nicht funktioniert!

Gibt es eine Erklärung für alle? Und wenn die "reguläre" Funktionsdeklaration wirklich so "fragil" ist und vom gleichnamigen Funktionsobjekt leicht überschrieben werden kann, sollte ich mich davon fernhalten?

Eine andere Frage ist: Wird diese Vorwärtsdeklaration nur mit dem Funktionsobjektformat unmöglich? Gibt es eine Möglichkeit, dies in Javascript zu "simulieren"?

Antworten:

3 für die Antwort № 1

Javascript funktioniert so:

Das Dokument wird analysiert und die function Erklärungen werden alle unmittelbar vor der Ausführung der tatsächlichen Aussagen berücksichtigt. Dies erklärt Ihr erstes Beispiel.

Wenn Sie einer lokalen Variablen eine Funktion zuweisen, die während der Ausführung ausgeführt wird, können Sie die Methode in Ihrem zweiten Beispiel nicht verwenden.

Wenn Sie eine Funktion zweimal deklarieren, wird die letzte von der gesamten Anwendung verwendet. Das ist dein drittes Beispiel.

Diese Funktionen sind Mitglieder der window Objekt werden sie tatsächlich global deklariert. Wenn Sie einem Wert einer Funktion eine lokale Variable zuweisen, hat diese lokale Variable Vorrang vor Mitgliedern in der window Objekt. Wenn Javascript eine lokale Variable nicht finden kann, durchsucht es den Bereich, um sie zu finden window Objekt ist der letzte Ausweg. Das ist, was in deinem letzten Beispiel passiert ist, es hat eine Variable say Das ist in einem spezifischeren Umfang als die globale Funktion say.

Wenn Sie neu deklarieren würden say zur Laufzeit, d. h. tauschen Sie die Reihenfolge der Deklarationen in Ihrem letzten Beispiel aus, dann würden Sie die zwei verschiedenen Warnungen sehen, die Sie erwarten würden:

say(); //speak, the global function

function say() {
alert("speak");
}

var say = function() {
alert("say");
}

say(); //say, the declared local variable

1 für die Antwort № 2
say();

function say()
{
alert("say");
}

Hier holt sich der Interpreter die Definition von say() wenn es aufgerufen wird, und es ausführt.

say();

say = function()
{
alert("say");
}

Hier gibt es keine Definition von say() Abrufen - stattdessen weisen Sie einer Variablen eine anonyme Funktion zu. Der Interpreter kann dies nicht "finden", so wie er Vorwärtserklärungen finden kann.

function say()
{
alert("speak");
}

say();

function say()
{
alert("say");
}

Hier say wird definiert und dann neu definiert - die letzte Definition gewinnt.

say = function()
{
alert("speak");
}

say();

function say()
{
alert("say");
}

say();

Hier say ist eine Variable, die auf eine anonyme Funktion verweist(nachdem die erste Anweisung interpretiert wurde). Dies hat Vorrang vor jeder Funktionsdefinition, so als ob Sie die Funktionsdefinition vor der Zuweisung platziert hätten.

Aber wenn du hättest

say();

say = function()
{
alert("speak");
}

say();

function say()
{
alert("say");
}

Dann erhalten Sie "say" gefolgt von "speak".


0 für die Antwort № 3

Sie können erwarten, dass Ihre Funktionsdefinitionen sindin der Reihenfolge angewendet. Dann werden alle Ihre nicht methodischen Codezeilen in der richtigen Reihenfolge ausgeführt, einschließlich der Zuweisung von Funktionsobjekten. Dies erklärt jedes Ihrer Beispiele. Es ist jedoch ein interessantes Thema. Sie können wirklich kein Funktionsobjekt zuweisen nach versuchen, es aufzurufen, und erwarten, dass es funktioniert. Eine Funktionsdefinition, die auf ausführbaren Code folgt, wird jedoch zuerst angewendet.


0 für die Antwort № 4

Es ist immer eine gute Idee, die Funktion später aufzurufen, obwohl Javascript so funktioniert.

Die meisten Sprachen funktionieren nicht so, sondern so.

function say(){
alert("say");
}

say();

oder

say = function(){
alert("say");
}

say();

oder

(function(){
alert("say");
})();