1.let和const命令
在之前JavaScript中我们是如何定义一个变量的:var
比如定义一个Number类型的变量 var a=1
同时如果我想修改a的值;可以直接再定义;var a=2;前面一个值就被覆盖掉了;
在作用域中也提到过;var声明的是一个全局变量;
比如
console.log(a);
var a=3;
其输出的结果为:
是因为var能够提前声明一个变量既是它将a提前声明;因为console时a还没有赋值所有是undefined类型 ;而不是报错;但可能在开发的时候存在问题;
1.而用let和const声明的变量就没用类型提升了
console.log(a)
let a=5
所以会报错而不是undefined类型!!
2.let和const都是块作用域
之前在JavaScript初级中提到了两个作用域的概念:全局作用域和函数作用域
在函数作用域中的定义的var只能在函数中被调用出了函数就⑧行了;而全局作用域中的var 变量哪里都可以使用
这里提到的这两个东西都是块作用域,比如
for(var a=0;a<1;a++){
let b=3;
}
console.log(a)
console.log(b)
因为var是提前声明的所以上文中的a直接跑到文档对前面提前声明了;但let却跑不出块无法声明在调用时找不到就报错了
这里可以引入之前for循环的一个问题,在for循环中嵌套一个函数时可能存在的闭包问题
for(var i=0;i<5;i++){
arr[i]=function(){
return i
}
}
上面这个我们理想中其输出的是对应循环内的i值;可其输出的结果却是5;原因在于var提前声明了,其走完之后function才开始,var i跳脱出了块元素所以其执行完了才轮到function
这里用let就不会有问题了,因为let作用域只在块元素内,
3.const
和java中的const一样表示只能定义一次,如果再定义就会出错;
const e=5
var e=6
4.不会污染全局变量
举个例子window的一个属性RegExp
var RegExp=10;
console.log(RegExp)
console.log(window.RegExp)
可以看到var改变了window中的RegExp的值
如果改成let