2010-12-10 12 views
0

Quelqu'un peut-il expliquer cela (le code dans le contexte global)Javascript attribution des variables globales à themself

var a = a || 4 // a exists & is 4 
window.a = window.a || 4 // a exists & is 4 
window.a = a || 4 // a is undefined error 
a = a || 4 // a is undefined error 

Une explication de ce que la différence entre ces 4 missions et pourquoi certains gérer correctement, mais d'autres ne le font pas. [Modifier] Cet exemple a été testé sur la console V8 Chrome.

Répondre

4
var a = a || 4 // var a is evaluated at compile time, so a is undefined here 
window.a = window.a || 4 // window.a is simply undefined 
window.a = a || 4 // no var a, therefore the variable doesn't exist, = reference error 
a = a || 4 // again, no var, reference error 

La déclaration var déclare la variable/fonction dans le champ d'encapsulage le plus proche et il définit à undefined. Quand il n'y a pas var, il n'y a aucune variable/fonction déclarée. Par conséquent, l'erreur de référence.

Quelques exemples.

function déclaration:

foo(); // works 
function foo() {} 

bar(); // TypeError: undefined is not a function 
var bar = function(){}; 

déclaration var:

function test(foo) {   
    if (foo) { 
     var bar = 0; // defined at compile time in the scope of function test 
    } else { 
     bar = 4; // sets the bar above, not the global bar 
    } 
    return bar; 
} 

console.log(test(false)); // 4 
console.log(bar); // ReferenceError 
+0

Bien sûr, la différence ici est une propriété non définie sur un objet et un objet non déclaré. Pourquoi un non défini à la compilation mais non déclaré lors de l'exécution? – Raynos

+0

L'instruction 'var' déclare la variable dans la portée d'encapsulation la plus proche et la définit sur' undefined'. Quand il n'y a pas 'var', il n'y a aucune variable déclarée. Par conséquent, l'erreur de référence. –

+0

Nice, je ne savais pas 'var bar = 0' a été défini au moment de la compilation dans la portée de la fonction. C'est pourquoi j'ai seulement besoin d'une déclaration 'var' au lieu de deux – Raynos