2010-07-27 5 views
7

Quelqu'un peut-il me dire pourquoi la dernière journalisation de 'x' vaut 0 et non 1. Je pensais parce qu'il est déclaré en dehors d'une fonction, il a une portée globale, puis dans la fonction sa valeur est définie à 1 et cette valeur resterait comme c'est un global? Je sais que la première valeur 'x' à l'intérieur de la fonction est une variable globale car toute variable déclarée sans le mot-clé var devient une propriété de l'objet window. Un grand merciEt je pensais avoir compris la portée

var x = 0; //global variable 

function y(){ 
    x = 1; 
    log("1. %n ", x);//1. 1 

    var x = 2; 
    log("2. %n ", x);//2. 2 
} 

y(); 
log("3. %n ", x);//3. 0 

Répondre

6

La déclaration var fait l'objet d'levage, lorsque votre code est évalué, il ressemble vraiment à ceci:

var x = 0; //global variable 
function y(){ 
    var x; // local!! 

    x = 1; 
    log("1. %n ", x);//1. 1 

    x = 2; 
    log("2. %n ", x);//2. 2 
} 

y(); 
log("3. %n ", x);//3. 0 

Juste avant y est exécuté, un nouveau contexte d'exécution est la configuration et le processus Variable Instantiation prend Placez avant la fonction est exécutée.

C'est l'une des raisons pour lesquelles JSLint recommande une seule instruction var par fonction, pour ressembler à ce qui se passe réellement.

+0

Merci l'homme. Peut toujours répondre sur vous pour la réponse. – screenm0nkey

+0

Vous êtes les bienvenus @Nick, je suis heureux d'aider! – CMS

1

Je pense, mais ne peut pas confirmer par la spécification ECMAScript, que la ligne « var x = 2 » est analysé au moment de la définition de la fonction et la portée locale de « x » applique pour l'ensemble fonction, pas juste après la position de la ligne "var x" dans la fonction.

est ici un test plus simple (testé par jsdb):

js>x = 0; 
0 
js>function foo(k) { x=k; } 
js>function bar(k) { var x=k; } 
js>function baz(k) { x=k; var x=2; } 
js>foo(1) 
js>x 
1 
js>bar(2) 
js>x 
1 
js>baz(3) 
js>x 
1 

Vous remarquerez que la seule fonction ici qui affecte le monde « x » est foo(). La fonction bar() affecte évidemment uniquement un x local. Mais la fonction baz() affecte uniquement le x local. On pourrait penser que l'affectation x=k; affecterait le global x, puisqu'il se passe "avant" l'instruction suivante var x = 2; qui affecte clairement une variable locale x. Mais je suis assez sûr que si vous faites var x dans une fonction, l'interprète voit et l'applique à tous les utilisations de x dans cette portée. Même situation que la vôtre.

5

La x variable dans la fonction est créée immédiatement lorsque la fonction est exécutée et non seulement lorsque la ligne avec le variable statement est atteinte:

Si la déclaration variable apparaît dans une FunctionDeclaration, les variables sont défini avec l'étendue function-local dans cette fonction [...]. Les variables sont créées lorsque la portée d'exécution est entrée. [...] Les variables sont initialisées à undefined lors de la création. [...]

Vous pouvez voir que x est initialement undefined lors de l'ajout d'un appel log en face de la première mission:

function y(){ 
    log("0. " + x);//0. undefined 
    x = 1; 
    log("1. " + x);//1. 1 
    var x = 2; 
    log("2. " + x);//2. 2 
} 

Cela signifie que les deux missions dans la fonction se réfèrent à x dans le Fonction- portée locale et non x dans la portée globale.

+0

+1 oui, et voir la réponse du CMS aussi parce qu'il utilise le mot manquant "levage". –

+0

+1 Merci l'homme.Juste quand je pense savoir ce qui se passe avec JavaScript, quelque chose d'autre me dérange. Merci pour votre réponse – screenm0nkey

Questions connexes