一、var变量
1.var有变量提升
二、let变量
let声明变量有以下几个特点:
1.没有变量提升,var有变量提升
function sayname() {
console.log(name)
console.log(age)
var name = “lili”
let age = “20”
}
sayname()
// undefined
// Uncaught ReferenceError
上面打印也很好理解:var 有变量提升,有个预解析的过程,所以在打印之前相当于先var name,然后再name = “lili”,所以第一个打印为undefined。第二个打印因为let没有预解析过程,所以就直接报错了。
2.不可以重复声明。
重复声明问题:
var a = 1
var a = 3
let b = 2
let b = 3
很简单,当你在一个块级作用域声明了一个b,你不能再声明b,否则会报错,当然在不同的块级作用域是可以重复声明的。然而var就可以
3.{}代表块级作用域,let有块级作用域,var只有函数作用域。
块级作用域与函数作用域问题:
function tes(){
var a = 'var ok'
let b = 'let ok'
for (var i = 0; i < 1; i++) {
var a = 'var change'
let b = 'let change'
}
console.log(a)
console.log(b)
}
tes()
打印:var change let ok
因为var只有函数作用域的概念,所以命名相同参数在同一作用域下会覆盖的,而let有块级作用域,function和for循环是两个不同的作用域,所以打印b不会取不同作用域的值。
三、const声明的常量
const声明常量,只可以声明一次,并且必须赋值,可以防止命名冲突,防止之后发生错误的修改。