一、作用域
声明变量时,无论是用var,let还是const,所声明的变量都有一个共同点:在全局作用域声明的变量是全局变量,在函数作用域中声明的变量为局部变量。在这一点上,他们的效果和用法是相同的。
它们的不同点在于,let和const声明的变量存在块级作用域,也称暂时性死区,它们在声明的块级作用域内有效,包括{}内的代码块。
二、变量的声明与访问
var与let
1.let声明的变量不能提升
console.log(a); //undefined
var a=10;
用var声明的变量其声明会被提升到当前作用域的最前方(赋值不提升),上述代码相当于:
var a;
console.log(a);
a=10;
console.log(a); //报错
let a=10;
用let声明的变量不会提升,报错:变量的使用要在声明之前
2.let变量不能重复声明
var b=10;
var b=20;
console.log(b) //20
------------------------------------------------------------
let a=10;
~~let a=20;~~
console.log(a) //报错
var声明的变量写在后面的赋值可以覆盖前面的,打印b的值是20,而let变量不可以重复声明,此时会报错:变量a已被声明
3.let声明的变量只在当前块作用域中有效
var a = 10;
if (1) {
let a = 20;
}
console.log(a); //10
正常情况下只有function会产生局部作用域,而let a写在var a之后,后赋值的a会覆盖先赋值的a,打印a的结果应该是20,但是这里是10。这是因为let声明的变量会在其{}内产生一个块级作用域,称为暂时性死区,此时let声明的变量只在此块级作用域中有效。
4.let声明的变量会产生暂时性的死区,只能在当前块作用域中查找
var b = 10;
if (1) {
console.log(b); //10
var b = 20;
}
-----------------------------------------------------------
var a = 10;
if (1) {
console.log(a); //报错
let a = 20;
}
上文我们已经知道了什么是暂时性死区,尽管用var声明了变量a,在暂时性死区中若有用let声明的与死区外部同名的变量,则死区内使用a变量的语句或者方法只会在死区内查找变量a,而不会到死区外部查找,而let声明的变量不能提升,此时会报错:变量的使用要在声明之后。
var与const
首先要明确,const声明的标识符为常量,而常量是不可改变的量。
1.const声明的常量必须赋初值
var a;
console.log(a) //undefined
const b; //报错 Missing initializer in const declaration 常量声明中缺少初始值
2.const声明的常量一旦赋值则无法再改变
const a=10;
a=20;
console.log(a); //报错 Assignment to constant variable. 把变量赋值给了常量
除了上述两点区别之外,var与let还有四点区别,和var与let的四点区别一致,这里就不做过多赘述了。希望此文章对你有所帮助。