/ / Variables locales et globales dans les boucles [dupliquer] - javascript

Variables locales et globales dans les boucles [duplicate] - javascript

Je connais les bases des variables locales et globales, mais est-ce que quelqu'un pourrait expliquer la différence entre ces deux exemples de code?

var elements = document.querySelectorAll(".classname");
for (var i = 0; i < elements.length; i++) {
// do something
}

et

var elements = document.querySelectorAll(".classname");
for (i = 0; i < elements.length; i++) {                 // <-- removed "var" before "i = 0"
// do something
}

Réponses:

1 pour la réponse № 1

Avec le var mot-clé, il n'y a pas de portée "bloc", les déclarations sont donc soit "fonction", soit "globales". Le fait que vous déclariez une variable dans une boucle ou dans une branche true / false d'un if instruction ne crée pas une variable limitée à ce bloc de code. C'est assez différent de la plupart des langages compilés.

ECMAScript 2016 (a.k.a. ES6) introduit la portée "bloc" avec le let mot-clé.

Donc, si vous omettez le var mot-clé et créez simplement une nouvelle variable dans une fonction, cette variable devient globale car le moteur d’exécution JS ne sait pas où vous le souhaitez.

Voici quelques exemples:

// Outside of functions, the var keyword creates global variables
var g = "global";

function foo(){
// Inside of functions, the var keyword creates "local" or function scoped variables
var l = "local";

// But, omitting the "var" keyword, whereever you do it, creates a global
oops = "global";

// But, creating a function scoped variable of the same name as a variable in a higher
// scope, just hides the one from the higer scope as long as the code runs in the smaller
// scope:
var g = "local";

// Other than global and function, the var keyword does not create "block" scope:
if(true){
var x = "surprise!";
}

// Now, we"ll see what we get when we are in the local scope:
console.log(g);     // "local", not "global" because smaller scope prevails
console.log(l);     // "local";
console.log(oops);  // "global"
console.log(x);     // "surprise!" because x has function scope, not block

}

foo();

// Now, we"ll see what is available back in the global scope:
console.log(g);         // "global" because now we are in the global scope
console.log(typeof l);  // It"s an error to try to access directly, type is undefined
console.log(oops);      // "global" because we omitted var and it became global
console.log(typeof x);  // It"s an error to try to access directly, type is undefined