Mentre altri hanno spiegato il "sollevamento" il comportamento di funzioni (che personalmente trovo definendolo preparazione contesto o pre-elaborazione più chiaro di sollevamento) la ragione del diverso comportamento di Firefox rimane senza risposta.
Per iniziare, è necessario conoscere la differenza tra una dichiarazione di funzione e una dichiarazione di funzione .
una dichiarazione di funzione, come nel tuo esempio può avvenire solo in due luoghi, nel codice globale (al di fuori di qualsiasi funzione) e direttamente all'interno del corpo della funzione di un'altra funzione, ad esempio:
function foo() {}
function bar() {
function baz() {}
}
Tutto il le funzioni di cui sopra sono dichiarazioni di funzioni valide.
L'ECMAScript Specification non permette di definire dichiarazioni di funzioni in altri luoghi, ad esempio all'interno di blocchi:
if (true) {
function foo() {}
}
La funzione di cui sopra dovrebbe dare un'eccezione SyntaxError
, ma la maggior parte delle implementazioni sono benevoli, e loro continuerà a pre-elaborare (sollevare) la funzione, anche se la funzione effettiva non è raggiungibile (ad es. if (false) { function bar() {} }
).
In Firefox, dichiarazioni di funzione sono permessi, il che significa che la definizione di funzione in realtà accade quando il controllo raggiunge questa affermazione specifico, ad esempio:
if (true) {
function foo() { return true; }
} else {
function foo() { return false; }
}
Esecuzione foo();
dopo le dichiarazioni di cui sopra, in Firefox produrrà true
, perché il primo ramo dell'istruzione if
viene effettivamente eseguito.
In altri browser, foo();
produce false
poiché tutte le funzioni sono pre-elaborati quando si entra nel contesto di esecuzione, e l'ultima avrà la precedenza, anche se il ramo false
dell'istruzione if
è mai raggiunto.
La console di Firebug, esegue il suo codice avvolgendolo all'interno di un blocco try-catch
, è per questo che la funzione non è disponibile prima sua dichiarazione.
Se provate sulla console:
console.log(typeof f); // "undefined"
function f() {}
vedrete che f
non è ancora pronto, ma se si avvolge il codice all'interno di una funzione, si vedrà il comportamento previsto:
(function() {
console.log(typeof f); // "function"
function f() {}
})();
Anche in questo caso, ora f
è definito come una dichiarazione di funzione, poiché esiste nel corpo della funzione anonima e non fa parte di un'istruzione Blocco.
Qual è l'uscita della console? – wosis