Answers:
let
与以下内容const
有两个主要区别var
:
var
在声明之前访问a 会有结果undefined
;在声明之前访问a 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.
babel.js编译器默认未启用TDZ 。启用“高合规性”模式以在REPL中使用它。提供es6.spec.blockScoping
标志以与CLI一起使用或作为库使用。
推荐进一步阅读:TDZ神秘化,ES6 Let,Const和“深度死区”(TDZ)位于深度。
let foo
在一个块中引起它被吊起并在该块的顶部声明。该行let foo
导致它被初始化。并foo = xyz
为其分配一个值。
吊装:
let
,const
,var
都是GET悬挂过程。
(这意味着它们会上升并在范围的顶部声明。)
初始化:
var
还要经过初始过程,并获得的初始值undefined
。let
,const
没有去扔初始过程,所以他们的价值观仍无法进入,尽管他们已经宣布。什么把它们放进去temporal dead zone
所以不久:
吊装过程:
var
,let
,const
初始化过程:var
对于let和const变量,基本上,时间死区是一个区域
“在声明变量之前”,
也就是说,如果您无法访问这些变量的值,则会引发错误。
例如
let sum = a + 5; //---------
//some other code // | ------> this is TDZ for variable a
// |
console.log(sum) //---------
let a = 5;
上面的代码给出了一个错误
当我们将var用作变量'a'时,相同的代码不会产生错误,
例如
var sum = a;
console.log(sum) //prints undefined
var a = 5;
undefined
和的结果5
)。所述declaratation的var a
被悬挂,inifialisation代码settng a
至5不是。