ES6introduit des Letvariables qui vient avec block level scoping. Jusqu'à ce que ES5nous n'en ayons pas block level scoping, les variables déclarées dans un bloc sont donc toujourshoisted fonctionner au niveau de la portée.
ScopeSe réfère essentiellement à l'endroit où dans votre programme vos variables sont visibles, ce qui détermine où vous êtes autorisé à utiliser les variables que vous avez déclarées. Dans ES5nous avons global scope,function scope and try/catch scope, avec ES6nous obtenons également la portée au niveau du bloc en utilisant Let.
- Lorsque vous définissez une variable avec un
varmot clé, la fonction entière est connue à partir du moment où elle est définie.
Lorsque vous définissez une variable avec une letinstruction, elle n'est connue que dans le bloc auquel elle est définie.
function doSomething(arr){
//i is known here but undefined
//j is not known here
console.log(i);
console.log(j);
for(var i=0; i<arr.length; i++){
//i is known here
}
//i is known here
//j is not known here
console.log(i);
console.log(j);
for(let j=0; j<arr.length; j++){
//j is known here
}
//i is known here
//j is not known here
console.log(i);
console.log(j);
}
doSomething(["Thalaivar", "Vinoth", "Kabali", "Dinesh"]);
Si vous exécutez le code, vous pouvez voir que la variable jest uniquement connue dans le loopet non avant et après. Pourtant, notre variable iest connue à entire functionpartir du moment où elle est définie.
Il y a un autre grand avantage à utiliser let car cela crée un nouvel environnement lexical et lie également une nouvelle valeur plutôt que de conserver une ancienne référence.
for(var i=1; i<6; i++){
setTimeout(function(){
console.log(i);
},1000)
}
for(let i=1; i<6; i++){
setTimeout(function(){
console.log(i);
},1000)
}
La première forboucle imprime toujours la dernière valeur, avec letelle crée une nouvelle portée et lie les nouvelles valeurs nous imprimant 1, 2, 3, 4, 5.
En ce qui concerne constants, cela fonctionne essentiellement comme let, la seule différence est que leur valeur ne peut pas être modifiée. Dans les constantes, la mutation est autorisée mais la réaffectation n'est pas autorisée.
const foo = {};
foo.bar = 42;
console.log(foo.bar); //works
const name = []
name.push("Vinoth");
console.log(name); //works
const age = 100;
age = 20; //Throws Uncaught TypeError: Assignment to constant variable.
console.log(age);
Si une constante fait référence à un object, elle fera toujours référence au objectmais le objectlui - même peut être modifié (s'il est modifiable). Si vous aimez avoir un immuable object, vous pouvez utiliserObject.freeze([])
let foo = () => bar; let bar = 'bar'; foo();illustre toutes les déclarations sont effet hissé encore mieux, car ce n'est pas évident en raison de la zone morte temporelle.