ES6
introduit des Let
variables qui vient avec block level scoping
. Jusqu'à ce que ES5
nous 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.
Scope
Se 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 ES5
nous avons global scope,function scope and try/catch scope
, avec ES6
nous obtenons également la portée au niveau du bloc en utilisant Let.
- Lorsque vous définissez une variable avec un
var
mot clé, la fonction entière est connue à partir du moment où elle est définie.
Lorsque vous définissez une variable avec une let
instruction, 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 j
est uniquement connue dans le loop
et non avant et après. Pourtant, notre variable i
est connue à entire function
partir 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 for
boucle imprime toujours la dernière valeur, avec let
elle 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 object
mais le object
lui - 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.