Skip to content

var let const

总结

varletconst
作用域全局作用域和函数作用域块级作用域块级作用域
变量提升
是否可以声明前访问变量
使用默认值 undefined报错 ReferenceError报错 ReferenceError
是否允许重复声明可以不可以,报错不可以,报错
全局定义的变量属于全局对象的属性不属于全局对象的属性
window.变量名会是undefined
不属于全局对象的属性
window.变量名会是undefined
初始化不强制
未初始时是 undefined
不强制
未初始时是 undefined
必须
是否可再次被赋值可以可以不可以

作用域解释

  • var 声明范围是全局作用域和函数作用域

在函数中使用 var 定义的变量会成为此函数的局部变量

在全局范围使用 var 定义的变量,或在任何位置省略 var 定义的变量,会成为全局变量

js
(function fun() {
    var test = 0
}())
console.log(test) // 报错

(function fun() {
    test = 0
}())
console.log(test) // 0
  • letconst 声明范围是块级作用域
js
if (true) {
    var test = 0
}
console.log(test) // 0

if (true) {
    let test = 0
}
console.log(test) // 报错

上面代码只是对比,不能同时在一个块里,因为 letvar 的重复声明会报错。重复声明不会因为 letvar 的混用而失效

for 循环中的声明

是否会渗透到外部

使用 var 定义的迭代变量会渗透到循环体外部

js
for (var i = 0; i < 5; i++) {
    // 循环逻辑
}
console.log(i) // 5

使用 letconst 定义的变量仅限于 for 循环块内

js
for (let i = 0; i < 5; i++) {
    // 循环逻辑
}
console.log(i) // 报错,i 无定义

letconst 适用范围

let 适合声明迭代变量,因为迭代变量会改变

js
for (let i = 0; i < 5; i++) {
    // 循环逻辑
}

const 适合声明不会被修改的循环变量,如 for-offor-in 中使用

js
for (const value of [1, 2, 3]) {
	// 循环逻辑
}

const 的变值限制

  • 限制值类型,限制引用类型的地址
  • 但不限制引用类型的内部改变
js
const person = {}
person.name = 'kingmusi' // ok