前言
es6新增let和const命令,用来声明变量,用法类似var,接下来,我将详细的说说let和const
1.为什么新增let
- var不好吗,为啥要新增一个let呢?
var缺点还真的多,我能列出三点:
1.可以重复声明
2.无法限制修改
3.木有块级作用域
重复声明 :
var a = 10;
var a = 20;
console.log(a)//20
木有块级作用域
啥是块级作用域呢?
{},if(){},for(){}
{
var a = 10;
console.log(a)//10
}
console.log(a)//10
var name="susu";
if(true){
var name="susu000";
console.log(name)//susu000
}
console.log(name)//susu000
- var不够用吗,木有let的时候怎么搞呢?
当然是闭包啦
var只有在只有在function(){}中才有作用域
var name = "susu";
if (true) {
(function() {
var name = "susu000";
console.log(name)//susu000
})()
}
console.log(name)//susu
var name = "susu";
if (true) {
(function(name) {
console.log(name)//hello
})('hello')
}
console.log(name)//susu
2.let
不能重复声明
let a = 10;
let a = 120;
console.log(a)//报错Identifier 'a' has already been declared
具有块级作用域
{
let a = 10;
console.log(a)//10
}
console.log(a)//a is not defined
注意:不具有变量提升
3.用let解決一些问题
一个经典的for循环语句
for (var i = 0; i < 8; i++) {
setTimeout(() => {
console.log(i)//8个8
},100)
}
如何解决呢?
方法一:let
for (let i = 0; i < 8; i++) {
setTimeout(() => {
console.log(i)//8个8
},100)
}
方法二:闭包
for (var i = 0; i < 8; i++) {
(function(i) {
setTimeout(() => {
console.log(i)
}, 100)
})(i)
}
4.const
const 声明一个常量,一旦声明,常量的值不可改变
不得改变值,一旦声明,就必须立即初始化
只在声明的块级作用域内生效
变量不提升,只能在声明的位置后使用
与let一样,不可重复
声明复合类型的数据,(主要是对象和数组),变量指向的内存地址
const NAME="susu";
console.log(NAME)
const obj = {
"name": 'sss',
"age": 1,
};
console.log(obj)
obj.name = "susu "
// obj={}//Assignment to constant variable.
console.log(obj)
//没法跟let一样 ,先声明
const NAME;
NAME="ss"
console.log(NAME)//Uncaught SyntaxError: Missing initializer in const declaration
let a;
a=10;
console.log(a)//10