✈var
🚗几个小小的实例
var a=10;
var a=20;
console.log(a)//结果为 20 说明可以重复声明而且值也改变
console.log(a)//结果为 underfind,说明用var声明的变量,有声明提升。使用可以在声明前。
var a=50;
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);//结果为10
}
}
a[5]();
小结:从上我们可以发现var
声明的变量是一个全局变量有它的长处也有它的不足,所以
Es6新增了一个命令let
,也是用于声明变量的
✈let
🚗几个小小的实例
/*例子:1*/
let a = 10;
let a = 20;//结果:报错,Identifier 'a' has already been declared(标识符a已经被声明了)
console.log(a);
//说明不可以重复声明同一名称的变量
console.log(a);// 结果:报错,Cannot access 'a' before initialization(不能在初始化之前使用a)
let a = 10;
//说明let声明的变量不存在声明提升
第一行 let a = 10;
第二行 if (true) {
第三行 console.log(a);//报错,在初始化之前无法访问'a',我们明明定义了a为什么报错呢?
第四行 let a = 30; // 块级作用域
第五行 }
第六行 console.log(a);//10
在最后一个小例子中我们发现,我们已经定义了a,为什么在后边打印a还会报错呢?这就得提一下两个概念暂时性死区
和块级作用域
🚑暂时性死区和块级作用域(解释如有不妥还请大佬们指正)
块级作用域: 用let
声明了某个变量后,如果遇到{}
就会形成一个作用域,我们把这个{}
内的区域叫做块级作用域,如上我们在第一行声明了let a=10
在第二行至第五行有一个块级作用域,所以运行到这里,外部的a是无法进去的,我们内部也不能调出这个块及作用域
向上查找,所以我们想要在这个块级作用域内使用a
则就会报错。
-
为什么需要块级作用域?
第一种情况:内层变量可能会覆盖外层变量
第二种情况:循环中的计数器变量变成了全局变量。
暂时性死区: 在块级作用域内只要用let
声明了变量,这个变量就和此作用域绑定了,并且仅在此区域内可使用。
✈var和let对比
let
不存在声明提升,如果在声明前调用,会报错;var
可以在声明前调用,值为undefined。let
不允许重复声明(如上例子1所示),var
可以重复声明。let
在使用时要注意暂时性死区和块级作用域问题
✈const
const
的用法和let
一样。
相同点:
- 不存在声明提升
- 暂时性死区
- 块级作用域
- 不允许重复声明。 不同点:
- const用于声明常量;const声明的变量,必须赋值,而且值不能改变
let a;
a = 10;
const b; //Missing initializer in const declaration const声明的变量没有初始化。说明不存爱声明提前
const b = 20;
b = 30;
console.log(b);//报错!说明不可以更改const声明的变量值
const arr = [10,20,30];
arr.push(40);
console.log(arr);
//为什么这里我们声明了arr数组,我们却可以改变数组的元素呢?Q1
✔总结
- FQ1:const定义的变量存储的值如果是复杂数据类型,只要地址不变,就不算修改。
- 一般情况下我们使用
let
和var
就可以了,const常用于获取元素节点,引入模块化等。