let
et const
ont deux grandes différences de var
:
- Ils ont une portée de bloc .
- L'accès à a
var
avant qu'il ne soit déclaré a le résultat undefined
; accéder à un let
ou const
avant 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 let
déclarations (et const
, qui fonctionne de la même manière) ne peuvent pas être hissées , car aLet
ne semble pas exister avant qu'on lui attribue une valeur.
Ce n'est pas le cas, cependant - let
et const
sont hissés (comme var
, class
et 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 aLet
est 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 let
est 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 x
dans la portée interne provoque toujours un ReferenceError
. S'il let
n'é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.blockScoping
indicateur 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 .