var变量的提升机制
当我们在全局作用域或者局部作用域中,使用var声明的变量将会被提前到作用域的顶端,这就是变量提升。
function test() {
console.log(a)
var a = 1
console.log(a)
}
//undefined
//a = 1
从上面的结果我们可以看出a变量被提升到了当前作用域的顶端,所以当我们第一次尝试读取a的值时a为undefined,而不是显示为定义。第二次才读取到a的值为1
function test() {
var a
console.log(a)
a = 1
console.log(a)
}
因此使用var声明变量时,js会将代码解析为上述情况。
let声明
let是ES6标准新加入的变量声明方式,其作用和var一样都是声明一个变量。不同的是let声明的变量不会提升,let声明的变量只在当前作用域中有效,也就是块级作用域。 ES6标准之后,推荐大家都使用let声明变量,而不是var。
console.log(foo)
let foo = 1
//报错
const声明
const是和let一起加入的新标准,作用和let一样都是声明一个块级作用域变量。不同的是const声明的是不可变块级作用域。一旦被声明后变量就不可在改变。
const声明对象
虽然const声明的变量不可以改变(也就是其指针的指向不能改变),但是使用const声明的对象的属性值是可以改变的。
const test = {
foo = 1
bar = 'a'
}
test.foo = 100 //100
test = 100 //报错