本人写这个专题的博客是为了总结一下自己学习,使用还有刷题时学到的ES6知识点,并做以归纳。
var,let,const
三个属性都可以声明变量。
作用域
var 重新赋值,重新定义变量,可以重复声明,但是后者的值会覆盖前者的值。
作用域:function(如果在全局中,作用域为windows)。var声明的变量会暴露在全局。
let 作用域:block,块级作用域,即 {} 内。
声明的变量只在其block中显示,不暴露在全局。不能重复声明变量。
const 与let一样,作用域都是block,而且不暴露在全局。与let一样不能重新赋值。但是引用的类型值可以更新,即可以在对象中进行更改:
使用Object.freeze()方法可以强制不允许更改:
立即执行函数,私有化变量
window变量举例:
这样会直接更改window中的name属性。使用立即执行函数:
然而这样不会有利于代码的可读性,而且这样也没有什么意义。于是采用let和const的 块级作用域这一特点实现:
{}中,即表示块级作用域
复习一下之前学习闭包时的一个题。for循环
for(var i=0;i<10;i++){
console.log(i);
}
输出自然是0~10之内的数字。然而在for循环中如果有其他的操作:
for(var i=0;i<10;i++){
console.log(i);
setTimeout(function(){
console.log(`i:${i}`)
},1000)
}
第一个输出就是0~10,然而第二个输出:i : 10。在之前的闭包中有写过这个问题:Mr.J--闭包学习
对于上面的问题,如果想输出对应输出的索引值,只需要将 var 更改 let 即可。(最近在Code wars中刷题已经逐渐减少了var的使用频率而改用let关键字)
变量提升
var 具有变量提升,(Mr.J -- 变量提升)而对于let和const中不能进行变量提升。
对于这个问题的解决:
- 默认使用const
- 当变量进行重新绑定或者重新更新使用let
- 尽量不在ES6中使用var