letet constont deux grandes différences de var:
- Ils ont une portée de bloc .
- L'accès à a
varavant qu'il ne soit déclaré a le résultat undefined; accéder à un letou constavant qu'il ne soit déclaré lance ReferenceError:
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
Il ressort de ces exemples que les letdéclarations (et const, qui fonctionne de la même manière) ne peuvent pas être hissées , car aLetne semble pas exister avant qu'on lui attribue une valeur.
Ce n'est pas le cas, cependant - letet const sont hissés (comme var, classet function), mais il y a une période entre l'entrée dans le champ d'application et la déclaration où ils ne sont pas accessibles. Cette période est la zone morte temporelle (TDZ) .
Le TDZ se termine quand aLetest déclarée , plutôt que attribué :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
Cet exemple montre qu'il letest hissé:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
Crédit: Temporal Dead Zone (TDZ) démystifié
L'accès xdans la portée interne provoque toujours un ReferenceError. S'il letn'était pas hissé, il se connecterait outer value.
Le TDZ est une bonne chose car il permet de mettre en évidence les bogues - accéder à une valeur avant qu'elle n'ait été déclarée est rarement intentionnel.
Le TDZ s'applique également aux arguments de fonction par défaut. Les arguments sont évalués de gauche à droite, et chaque argument est dans la TDZ jusqu'à ce qu'il soit affecté:
// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.
Le TDZ n'est pas activé par défaut dans le transpilateur babel.js . Activez le mode «haute conformité» pour l'utiliser dans le REPL . Fournissez l' es6.spec.blockScopingindicateur pour l'utiliser avec l'interface de ligne de commande ou comme bibliothèque.
Lectures complémentaires recommandées: TDZ démystifié et ES6 Let, Const et la «zone morte temporelle» (TDZ) en profondeur .