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 № 1Avec 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