6

Ich habe gerade ein Problem beim Definieren einer Funktion in einem Blockbereich festgestellt. Betrachten Sie das folgende Programm:Funktionsdeklaration oder Funktionsausdruck

try { 
    greet(); 

    function greet() { 
     alert("Merry Christmas!"); 
    } 
} catch (error) { 
    alert(error); 
} 

ich dieses Programm erwartet Merry Christmas! aufmerksam zu machen. Doch in Firefox gibt mir die folgende ReferenceError:

ReferenceError: greet is not defined 

Auf Opera und Chrome warnt es den Gruß, wie ich es erwartet hatte.

Offensichtlich behandelt Firefox die Funktion innerhalb des Blockbereichs als FunctionExpression, während Opera und Chrome es als FunctionDeclaration behandeln.

Meine Frage ist, warum Firefox sich anders verhält? Welche Implementierung ist logischer? Welche ist standardkonform?

Ich verstehe, dass Erklärungen in JavaScript gehisst werden und dann, wenn er die gleiche Funktion in zwei oder mehr verschiedenen Blöcken im gleichen Umfang deklariert wird dann gibt es einen Namenskonflikt sein.

Allerdings wäre es nicht logisch sein, die Funktion jedes Mal neu deklariert es deklariert ist, so dass Sie etwas tun können:

greet(); // Merry Christmas! 

function greet() { 
    alert("Merry Christmas!"); 
} 

greet(); // Happy New Year! 

function greet() { 
    alert("Happy New Year!"); 
} 

Ich denke, das sehr nützlich wäre, zusätzlich den Block zu lösen Scoping-Problem, das ich oben beschrieben habe.

+0

„neu deklarieren die Funktion jedes Mal, es erklärt hat, so dass Sie etwas tun können“ - sie sind * * Wieder Bezug genommen wird, nur die Deklaration erfolgt einmal und es wird hochgezogen. Haben Sie im vorigen Absatz nicht bestätigt, dass Sie das Hochziehen verstehen? – katspaugh

+2

Ja, ich verstehe das Hochziehen in JavaScript. Nein, mein Satz ist vollkommen klar. Was ich versuche zu sagen ist, dass jedes Mal, wenn der Interpreter auf eine 'FunctionDeclaration' trifft (_jedes Mal, wenn er deklariert wird_), er sie nur bis zur vorherigen Deklaration der Funktion im selben Bereich hochziehen sollte (_redeclare the function_). Da diese Funktion in JavaScript nicht vorhanden ist, können Sie sie nicht durch Angabe der aktuellen JavaScript-Standards ungültig machen. Es ist nur ein Vorschlag. Ein Vorschlag zur Implementierung mehrerer Deklarationen der gleichen Funktion in JavaScript. Hoffnung, die dir Klarheit bringt. Frohe Weihnachten @katspaugh –

+0

Oh, ich verstehe. Danke Herr, es ist niemandem auf dem ES Board aufgefallen. Frohe Weihnachten, Aadit! :) – katspaugh

Antwort

5

Tatsächlich ist die Funktionsdeklaration innerhalb von Blockbereichen ausdrücklich nicht standardisiert und das Verhalten ist implementierungsabhängig. Unterschiedliche Implementierungen reagieren unterschiedlich. Sie würden die gleiche Seltsamkeit bekommen, wenn Sie versuchten, eine Funktion innerhalb einer if-Anweisung zu deklarieren.

Die ES5 spec empfiehlt, dass Implementierer Funktionsdeklarationen machen innerhalb von Blöcken als Warnung oder Fehler gekennzeichnet werden.

+0

Sie sollten also keine Funktionen innerhalb von Blockbereichen deklarieren. Vielleicht ist das eine gute Programmierpraxis. –

+0

neben Javascript ist async lang. also müssen Sie Ihre Funktion definieren, bevor Sie sie anrufen können – Omiga

+0

@ Janim007, der ganze Punkt dieser Frage ist, dass Sie in JavaScript * eine Funktion topologisch aufrufen können, bevor es definiert ist. – katspaugh

Verwandte Themen