2015-09-21 3 views
1

J'essaie de comprendre les étendues variables dans Javascript et un ami m'a posé cette question. Je pourrais utiliser de l'aide ici.Accéder à la variable globale définie à l'intérieur d'une fonction

function abc(){ 
    var a = b = 10; // a is local, b is global variable. Right? 
    c = 5; // c is global variable 
} 
d = 20; // d is global variable 

console.log(b); // b is not defined error. Why? Isn't b a global variable? 
console.log(c); // Again, Why is 'c not defined'. 

J'ai exécuté ce code dans la console chrome. Ne devrais-je pas attendre 10 et 5 dans la console? Il donne une erreur 'b n'est pas défini', 'c n'est pas défini' à la place. Pourquoi cela se produit-il si b, c sont des variables globales? console.log (d) fonctionne très bien. Il s'agit d'un fiddle.

+2

Où est 'abc()'? – Rayon

+1

Si vous n'appelez pas 'abc',' b' et 'c' ne peuvent pas exister. –

Répondre

4

Pourquoi cela se produit si b, c sont des variables globales?

b et c ne sont créés si vous avez réellement appelabc. Simplement définissant la fonction n'exécute pas magiquement son corps.

function abc(){ 
    var a = b = 10; // a is local, b is global variable. 
    c = 5; // c is global variable 
} 

// call abc to execute the statements inside the function 
abc(); 

console.log(b); // 10 
console.log(c); // 5 

Cela dit, ce qui crée implicitement des variables globales n'est pas bon encore. Evitez si possible les globales, et sinon, déclarez-les explicitement en les affectant à l'objet global (window dans les navigateurs).

+0

Merci d'avoir clarifié cela. J'avais supposé à tort que déclarer simplement une variable sans le mot-clé var le rend accessible n'importe où. Nous appelons explicitement cette fonction ou utilisons des fonctions auto-appelantes. Et oui, j'évite autant que possible les variables globales. Je voulais juste l'aborder ici pour que je comprenne. – Rodiwa

1

EDIT: Voilà pourquoi j'aime, vous apprenez quelque chose savait même quand vous êtes tout savoir et répondre à vos questions sont clairement pas équipé pour répondre . Merci à @ la clarification de FelixKling J'ai mis à jour pour qu'il reflète que var s

Donc, il y a un peu d'une confusion terminologique qui se passe ici:

Javascript champ Niveau de fonction: comme a et b sont déclarées à l'intérieur du bloc function elles sont locales au function elles ont été déclarées à l'intérieur et sont limitées à la portée de function.

variables définies extérieur une fonction (ou dans un navigateur sur l'objet window, dans le noeud sur l'objet global), ont global portée. Donc, le mot-clé var n'a rien à voir avec l'étendue global, la portée est définie par l'endroit où vous déclarez une variable.

Prenant votre exemple:

function abc(){ 
    var a = b = 10; //a is local, b is global (see @FelixKling's answer) 
    c = 5; // c is global as it is not prefixed with the `var` keyword 
} 
var d = 20; // d is global 


console.log(a); // logs "10" to the console 
console.log(b); // b is not defined 
console.log(c); // 'c not defined'. 
console.log(d); // logs 20 to the console. 
+0

Les variables déclarées à l'intérieur du bloc fonction en utilisant le mot clé 'var' sont ** locales ** – Rayon

+1

' b' et 'c' ne sont pas déclarés. Ils sont assignés à et JavaScript les rendra globaux. –

+0

Il les déclare implicitement, mais dans la portée globale (pas très utile;)) –