主题
var let const
总结
var | let | const | |
---|---|---|---|
作用域 | 全局作用域和函数作用域 | 块级作用域 | 块级作用域 |
变量提升 是否可以声明前访问变量 | 使用默认值 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
- let 和 const 声明范围是块级作用域
js
if (true) {
var test = 0
}
console.log(test) // 0
if (true) {
let test = 0
}
console.log(test) // 报错
上面代码只是对比,不能同时在一个块里,因为 let 和 var 的重复声明会报错。重复声明不会因为 let 和 var 的混用而失效
for 循环中的声明
是否会渗透到外部
使用 var 定义的迭代变量会渗透到循环体外部
js
for (var i = 0; i < 5; i++) {
// 循环逻辑
}
console.log(i) // 5
使用 let 和 const 定义的变量仅限于 for 循环块内
js
for (let i = 0; i < 5; i++) {
// 循环逻辑
}
console.log(i) // 报错,i 无定义
let 和 const 适用范围
let 适合声明迭代变量,因为迭代变量会改变
js
for (let i = 0; i < 5; i++) {
// 循环逻辑
}
const 适合声明不会被修改的循环变量,如 for-of、for-in 中使用
js
for (const value of [1, 2, 3]) {
// 循环逻辑
}
const 的变值限制
- 限制值类型,限制引用类型的地址
- 但不限制引用类型的内部改变
js
const person = {}
person.name = 'kingmusi' // ok