2015-01-30 8 views
6
function g() { 
    var x; 
    function y() {}; 
    var z; 
} 

Ich möchte genau wissen, welche Reihenfolge der obige Code wird, wenn er gehisst wird.Auftrag zum Hochziehen in JavaScript

Theorie 1: Reihenfolge zwischen var s und function s bleibt wie sie ist:

function g() { 
    var x; 
    function y() {}; 
    var z; 
} 

Theory 2:var vor function s kommen S:

function g() { 
    var x; 
    var z; 
    function y() {}; 
} 

Theorie 3 :function s kommen vor var s:

function g() { 
    function y() {}; 
    var x; 
    var z; 
} 

Welche Theorie ist richtig?

Antwort

13

Funktionen werden zuerst, dann Variablendeklarationen gehißt, pro ECMAScript 5, section 10.5 die angibt, wie Hebes geschieht:

Wir Schritt 5 Handhabungsfunktionsdeklarationen ersten haben:

Für jede FunctionDeclaration f in Code, in Quelltext Bestellung durch ...

Dann Schritt 8 Griffe var Erklärungen:

Für jede VariableDeclaration und VariableDeclarationNoIn d in Code, tun in Quelltext, um ...

So Funktionen eine höhere Priorität als var Aussagen gegeben werden, da die späteren var Aussagen eine zuvor behandelt Funktion nicht überschreiben Erklärung. (Substep 8c erzwingt die Bedingung "Wenn varAlreadyDeclared falsch ist, dann [weiter ...]" so erhaltenen Variablenbindungen nicht überschrieben werden.)

Sie können auch see this experimentally:

function f(){} 
var f; 
console.log(f); 

var g; 
function g(){} 
console.log(g); 

Beide log Anrufe anzeigen die Funktion, kein undefined Wert.

+4

Um ganz klar zu sein, sagt er, dass 'Funktionen' vor 'var' kommen, was Theorie 3 im OP ist. – mareoraft