JS var、let、const区别

207 阅读2分钟

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不允许重复声明。

示例:

js1.jpg

暂时性死区

在使用let和const声明变量之前,该变量是不可用的。在语法上被称为暂时性死区,var声明的变量不存在暂时性死区。这是因为,在执行上下文创建阶段,使用let和const声明的变量只会创建,不会初始化,所以在使用时会出现ReferenceError。

示例:

js2.png

初始值设置

在声明变量时,var和let可以不用设置初始值。但是const必须设置初始值。

js3.png

赋值

使用var和let声明的变量可以进行赋值操作,使用const声明的变量只能指定初始值,不可以再赋值。

示例:

var a = 1;
let b = 1;
const c = 1;

a = 2; 
b = 2;
c = 2; // TypeError: Assignment to constant variable.

总结

区别varletconst
是否有块级作用域×
是否存在变量提升××
是否能重复声明变量××
是否存在暂时性死区×
是否必须设置初始值××
是否能赋值×