回答:
let
とconst
2つの大きな違いがありvar
ます。
var
宣言される前にアクセスすると、結果が得られundefined
ます。宣言される前、let
またはconst
宣言される前にthrows ReferenceError
:console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
これらの例から、let
宣言(およびconst
、同じように機能する)は、値が割り当てられる前は存在していないように見えるため、巻き上げられない可能性があるようにaLet
見えます。
すなわち、however-そうではないlet
とconst
されて掲揚(同様にvar
、class
とfunction
)が、スコープを入力し、それらにアクセスすることができない場合宣言されるまでの期間があります。この期間は、一時的なデッドゾーン(TDZ)です。
TDZは次のときに終了しaLet
ますは、割り当てられるのではなく、宣言さ。
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
この例は、 let
が持ち上げられます。
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
へのアクセス x
内部スコープですると、やはりが発生しReferenceError
ます。let
巻き上げられなかった場合は、ログに記録されますouter value
。
TDZはバグを強調するのに役立つため、良いことです。宣言される前に値にアクセスすることは、ほとんど意図的ではありません。
TDZは、デフォルトの関数引数にも適用されます。引数は左から右に評価され、各引数は割り当てられるまでTDZにあります。
// 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.
TDZは、babel.jsトランスパイラーではデフォルトで有効になっていません。「高コンプライアンス」モードをオンにして、REPLで。供給es6.spec.blockScoping
CLIまたはライブラリとしてそれを使用するためのフラグを。
さらに読むことをお勧めします:TDZ demystifiedおよびES6 Let、Const、およびDepthの「Temporal Dead Zone」(TDZ)。
let foo
ブロック内では、ブロックはそのブロックの最上部で持ち上げられて宣言されます。ラインlet foo
が初期化されます。そしてfoo = xyz
、それに値が割り当てられます。
巻き上げ:
let
、const
、var
すべての掲揚のプロセスを取得しています。
(何が意味するかというと、それらは上に行き、スコープの上部で宣言します。)
初期化:
var
初期プロセスも経て、の初期値を得る undefined
。let
、const
最初のプロセスをスローしなかったため、すでに宣言されていますが、それらの値にはアクセスできません。それらを入れたものtemporal dead zone
だからまもなく:
巻上工程:
var
、let
、const
初期化プロセス:var
letおよびconst変数の場合、基本的に、Temporal Dead Zoneはゾーンです
"変数が宣言される前"、
つまり、これらの変数の値にアクセスできない場合、エラーがスローされます。
例
let sum = a + 5; //---------
//some other code // | ------> this is TDZ for variable a
// |
console.log(sum) //---------
let a = 5;
上記のコードはエラーを出します
変数 'a'にvarを使用しても、同じコードでエラーは発生しません。
例
var sum = a;
console.log(sum) //prints undefined
var a = 5;
undefined
およびを追加した結果5
)。declaratationのvar a
掲揚されるが、inifialisationコードsettng a
5にはありません。