JS003-var、let、const的区别

156 阅读2分钟
  • var

    • 使用var关键字声明的变量,会在所有代码执行之前被声明(但是不会赋值);会自动提升到函数作用域顶部
    • 使用var在全局作用域中声明的变量会成为window对象的属性,在函数中定义的变量会成为函数对象上的属性,在函数退出时会被销毁(函数作用域)
    • 允许重复声明
//声明提前
console.log(a); //undefined
var a = 1;
console.log(a); //1

var b = 2;
console.log(window.b); //2

var a = 3; //重复声明,后声明的值会覆盖之前声明的值
console.log(a); //3

function help() {
    var c = 4;
    console.log(c);
}
help();
//函数作用域
console.log(c); //Uncaught ReferenceError: c is not defined
  • let

    • 不允许重复声明 (在全局作用域中使用let声明的变量不会成为window对象的属性,但是let声明仍然是在全局作用域中发生的,相应变量会在页面的生命周期内存在。因此为了避免SyntaxError,不能重复声明同一个变量)
    • 块儿级作用域
    • 不存在变量提升
    • 暂时性死区(let、const声明之前的执行瞬间,在声明之前就使用这些变量就会报错,这就是暂时性死区,而var会变量提升,所以不存在)
//不存在变量提升
//console.log(aa); //Uncaught ReferenceError: Cannot access 'aa' before initialization
let aa = 'lala';
console.log(aa); //lala
console.log(window.aa); //undefined
let aa = 'kaka'; //Uncaught SyntaxError: Identifier 'aa' has already been declared

//块级作用域
{
    let bb = 'dada';
    console.log(bb); //dada
}
console.log(bb); //Uncaught ReferenceError: bb is not defined
  • const

    • 声明必须赋初始值
    • 不允许重复声明
    • 值不允许修改(简单数据类型的值不许修改,复杂数据类型的地址值不许修改)
    • 块儿级作用域
    • 标识符一般为大写
const cc; //Uncaught SyntaxError: Missing initializer in const declaration

const dd = 3;
const dd = 4; //Uncaught SyntaxError: Identifier 'cc' has already been declared

const A = 1;
A = 2; //Uncaught TypeError: Assignment to constant variable

const B = {name: 'Tony', age: '18'};
B.age = 19;
console.log(B); //{name: 'Tony', age: 19}

{
    const C = 5;
    console.log(C); //5
}
console.log(C); //Uncaught ReferenceError: C is not defined
  • 总结:

    声明对象类型或常量使用const,声明其它类型使用let,尽量不使用var;不使用关键字声明的变量会创建在全局作用域中(严格模式下给未声明的变量赋值会导致错误)。

ee = 'in window';
console.log(window.ee); //in window

//严格模式下
"use strict"
ee = 'in window';
console.log(window.ee); //Uncaught ReferenceError: ee is not defined