let
und const
haben zwei große Unterschiede von var
:
- Sie haben einen Blockumfang .
- Der Zugriff auf a,
var
bevor es deklariert wird, hat das Ergebnis undefined
; Zugriff auf ein let
oder const
bevor 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 let
Deklarationen (und const
, die auf die gleiche Weise funktionieren) möglicherweise nicht gehisst werden , da aLet
sie nicht zu existieren scheinen, bevor ihr ein Wert zugewiesen wurde.
Das ist nicht der Fall, however- let
und const
sind hochgezogen (wie var
, class
und 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 aLet
wird 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 let
gehisst 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 x
im inneren Bereich verursacht weiterhin a ReferenceError
. Wenn let
es 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.blockScoping
Flag 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 .