var

  • 声明变量的时候存在声明提升

    什么是声明提升
    JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
    JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。

    1
    2
    console.log(a) //undefined
    var a = 1
  • 作用域范围是整个函数,不存在块级作用域

    1
    2
    3
    4
    5
    6
    function test() {
    if(1) {
    var a = 1
    }
    console.log(a) // 1
    }
  • 同一作用域下可以声明同名变量

    1
    2
    3
    var a = 1
    var a = 2
    console.log(a) // 2

let

  • 不存在声明提升

    1
    2
    console.log(a)//Cannot access 'a' before initialization
    let a = 1
  • 作用域是块级作用域

    let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问,而var可以跨块访问

    块级作用域:即在 {}花括号内的域,由 { }包括,比如if {}块、for () {}块。 函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体都是有定义的。

    1
    2
    3
    4
    5
    6
    function test() {
    if(1) {
    let a = 1
    }
    console.log(a) // a is not defined
    }
  • 同一作用域下不能声明同名变量

    1
    2
    let a = 1
    let a = 2 //Identifier 'a' has already been declared

const

  • 不存在声明提升

    1
    2
    console.log(a)//Cannot access 'a' before initialization
    const a = 1
  • 作用域是块级作用域

    1
    2
    3
    4
    5
    6
    function test() {
    if(1) {
    const a = 1
    }
    console.log(a) // a is not defined
    }
  • 同一作用域下不能声明同名变量

    1
    2
    const a = 1
    const a = 2 //Identifier 'a' has already been declared
  • 初始化时必须赋值,并且赋值后无法修改(引用类型可以修改内部数据)

    1
    2
    3
    4
    5
    6
    7
    8
    const a // Missing initializer in const declaration

    const a = 1
    a = 2 // Assignment to constant variable

    const a = {count:0}
    a.count = 1
    console.log(a) // {count: 1}