2013-05-11 14 views
8

ho scritto il seguente frammento di codice:Cosa sta succedendo con lo scope JavaScript qui?

var f = function() { document.write("a"); }; 

function foo() { 
    f(); 

    var f = function() { document.write("b"); }; 
} 

foo(); 

mi aspettavo la funzione che consente di stampare a di essere chiamato, ma dà invece un errore di runtime di chiamare un valore undefined. Perché succede?

+0

Questo fenomeno è certamente dettagliato in ogni libro JavaScript per principianti, per non parlare di innumerevoli tutorial per principianti e domande StackOverflow. Difficile capire perché le persone continuino a rimanere bloccate su questo. –

risposta

14

Si tratta di variabili di sollevamento http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html, http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/

codice Si è eqvivalent a quello successivo;

var f = function() { document.write("a"); }; 
function foo() { 
    //all var statements are analyzed when we enter the function 
    var f; 
    //at this step of execution f is undefined; 
    f(); 
    f = function() { document.write("b"); }; 
} 
foo(); 
0

Dal momento che (proprio come in Java) non c'è bisogno di preoccuparsi per la fine di definire le cose in un file in una determinata situazione si verifica. Quando si ridefinisce la variabile f, viene cancellata l'altra versione di f, ma non è definita fino a dopo così quando viene chiamato f si ottiene un errore.

Problemi correlati