var
用于声明一个函数范围或全局范围的变量
- 声明的变量的作用域:
- 声明在函数内部,是它当前的执行上下文及闭包(嵌套函数)
- 声明在任何函数外部,是全局的
- 特点:
- 重复声明JavaScript变量不会抛出错误(即使在严格模式 (strict mode) 下)
- 变量也不会丢失其值,直到调用其它的赋值操作
- 将在任何代码执行前被创建,这被称为变量提升。
- 这些变量的初始值为
undefined; - 提升将影响变量声明,而不会影响其值的初始化。在运行到复制语句之前,变量的值始终为
undefined;
bla = 2 var bla; // 可以隐式地(implicitly)将以上代码理解为: var bla; bla = 2; - 这些变量的初始值为
let
- 声明变量不会提升到代码块顶部,即不存在变量提升。
console.log(val); // undefined
let val = 123;
- 禁止重复声明同一变量
let val = 123, val = 234; //'val' has already been declared
- for循环语句中()内部,即圆括号之内会建立一个隐藏的作用域,该作用域不属于for后边的{}中,并且只有for后边的{}产生的块作用域能够访问这个隐藏的作用域,这使循环中,绑定块作用域有了妙用
const
- 声明常量,其值一旦被设定不能再被修改,否则会报错。但是虽然不允许修改绑定,但允许修改对象的值
const val = 123; val = 234; // Assignment to constant variable.
const obj = {a: 123}; obj = {}; // Assignment to constant variable.
const obj = {a: 123}; obj.a = 234; obj.b = 111; // 没有问题
- 声明变量不会提升到代码块顶部,即不存在变量提升。
console.log(val); // undefined
cobst val = 123;
- 禁止重复声明同一变量
const val = 123, val = 234; //'val' has already been declared
临时死区(Temporal Dead Zone, TDZ)
JS引擎,在扫描代码时发现变量声明时,遇到 let 和 const 声明,就会将声明放在TDZ中,访问TDZ中的变量会触发运行时错误。只有执行过变量声明语句后,变量才会从TDZ中移除,然后访客访问。