var和let、const的区别
变量提升
- 代码执行前,会把所有带var/function关键字的定义进行提前或声明
- var会提前声明
- function的是声明加定义
全局声明
全局上下文中,var声明的变量会给全局变量window加上一个属性,且其中一个值变化另一个也会变
var n = 10
console.log(n) // 10
console.log(window.n) // 10
window.n = 20
consolo.log(n) // 20
重复声明
- 相同上下文中,var可以重复声明,let不行且会报错
暂时性死区
- 不允许在声明变量前使用变量
块级上下文
- let/const/function都是产生新的块级私有上下文,定义的变量不能被外界使用,var不是
const
- 不能重新赋值
- 不能重新声明(同let)
- 必须在声明时给定初始值
- 定义对象的时候,只有对象的引用被保护(不能改变),对象的属性可以改变
const obj = {"key": "value"}
obj.key = "other" // 正常运行
var
- 在函数中,用 var 定义变量则是局部变量,不用 var 直接写变量,则是全局变量
function a () {
var b = 1
c = 2
return b
}
console.log(a()) // 先得运行函数a,否则c未被创建
console.log(b) // ReferenceError
console.log(c) // 2