1. var

var 是全局作用域和函数作用域

  • 全局作用域——变量在任何地方都可以使用
var carName = " Volvo";
 
// 此处可调用 carName 变量
function myFunction() {
    // 函数内可调用 carName 变量
}
  • 函数作用域——变量在函数里才可以使用
function myFunction() {
    var carName = "Volvo";
    // 函数内可调用 carName 变量
}
// 此处调用 carName 变量,就会报错
console.log(carName) // Uncaught ReferenceError: carName is not defined

var 变量声明会被提升,并初始化成 undefined

console.log(a) // undefined

var a = 1

相当于

var a = undefined
console.log(a) // undefined

a = 1

2. let、const

let 和 const 是块级作用域

let 或 const声明的变量只在 let 或 const命令所在的代码块{}内有效,在{}之外不能访问。

var x = 10;
// 这里输出 x 为 10
{ 
    let x = 2;
    // 这里输出 x 为 2
}
// 这里输出 x 为 10

let、const 也存在变量提升,不过变量并没有初始化成 undefined

console.log(a) // Cannot access 'a' before initialization 不能在初始化之前访问 a

let a = 1

相当于

let a
console.log(a) // Cannot access 'a' before initialization 不能在初始化之前访问 a

a = 1

let、const 区别在于 const 不能进行变量赋值