letund consthaben zwei große Unterschiede von var:
- Sie haben einen Blockumfang .
- Der Zugriff auf a,
varbevor es deklariert wird, hat das Ergebnis undefined; Zugriff auf ein letoder constbevor es deklariert wird wirft ReferenceError:
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
Aus diesen Beispielen geht hervor, dass letDeklarationen (und const, die auf die gleiche Weise funktionieren) möglicherweise nicht gehisst werden , da aLetsie nicht zu existieren scheinen, bevor ihr ein Wert zugewiesen wurde.
Das ist nicht der Fall, however- letund const sind hochgezogen (wie var, classund function), aber es ist eine Zeit zwischen der Eingabe und Umfang erklärt wird , wo sie nicht zugegriffen werden kann. Diese Periode ist die zeitliche Totzone (TDZ) .
Die TDZ endet , wenn aLetwird erklärt , anstatt zugeordnet :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
Dieses Beispiel zeigt, dass letgehisst wird:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
Gutschrift: Temporal Dead Zone (TDZ) entmystifiziert
Der Zugriff xim inneren Bereich verursacht weiterhin a ReferenceError. Wenn letes nicht gehisst würde, würde es sich protokollieren outer value.
Die TDZ ist eine gute Sache, da sie dazu beiträgt, Fehler hervorzuheben. Der Zugriff auf einen Wert, bevor er deklariert wurde, ist selten beabsichtigt.
Die TDZ gilt auch für Standardfunktionsargumente. Argumente werden von links nach rechts ausgewertet, und jedes Argument befindet sich in der TDZ, bis es zugewiesen wird:
// 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.
Die TDZ ist im Transpiler babel.js standardmäßig nicht aktiviert . Aktivieren Sie den "High Compliance" -Modus, um ihn in der REPL zu verwenden . Geben Sie das es6.spec.blockScopingFlag an, um es mit der CLI oder als Bibliothek zu verwenden.
Empfohlene weitere Lektüre: TDZ entmystifiziert und ES6 Let, Const und die „Temporal Dead Zone“ (TDZ) im Detail .