var、let和const都是Javascript中用来声明变量的关键字,这篇文章就来说一说它们之间有什么区别。
块级作用域
块级作用域是指由{ } 创建出来的作用域。只对let和const有效,对var无效。
示例:
{
var a = 1;
let b = 2;
const c = 3;
}
console.log(a); // 1
console.log(b); // error: b is not defined
console.log(c); // error: c is not defined
var声明的变量作用域只能是全局或者整个函数块的。
示例:
function varTest() {
var a = 1;
{
var a = 2; // 函数作用域中,同一个变量
console.log(a); // 2
}
console.log(a); // 2
}
function letTest() {
let a = 1;
{
let a = 2; // 块级作用域中,新的变量
console.log(a); // 2
}
console.log(a); // 1
}
varTest();
letTest();
变量提升
var存在变量提升,let和const不存在,只能在声明后使用,否则会报错。
示例:
console.log(varValue); // undefined
var varValue = 1;
console.log(letValue); // error: Cannot access 'letValue' before initialization
let letValue = 1;
console.log(constValue); // error: Cannot access 'constValue' before initialization
const constValue = 1;
重复声明
var声明变量时,可以重复声明,后者会覆盖前面的,但let和const不允许重复声明。
示例:
暂时性死区
在使用let和const声明变量之前,该变量是不可用的。在语法上被称为暂时性死区,var声明的变量不存在暂时性死区。这是因为,在执行上下文创建阶段,使用let和const声明的变量只会创建,不会初始化,所以在使用时会出现ReferenceError。
示例:
初始值设置
在声明变量时,var和let可以不用设置初始值。但是const必须设置初始值。
赋值
使用var和let声明的变量可以进行赋值操作,使用const声明的变量只能指定初始值,不可以再赋值。
示例:
var a = 1;
let b = 1;
const c = 1;
a = 2;
b = 2;
c = 2; // TypeError: Assignment to constant variable.
总结
| 区别 | var | let | const |
|---|---|---|---|
| 是否有块级作用域 | × | √ | √ |
| 是否存在变量提升 | √ | × | × |
| 是否能重复声明变量 | √ | × | × |
| 是否存在暂时性死区 | × | √ | √ |
| 是否必须设置初始值 | × | × | √ |
| 是否能赋值 | √ | √ | × |