let 和const与var的不同

时间:2022-01-02 20:20:46

1. let的作用域在代码块中仅限在当前的作用于中

1 {
2 var str1 = 12;
3 console.log(str1); //12
4 let str2 = 20;
5 console.log(str2); //20    
6 }
console.log(str1); //12
console.log(str2); //报错

2. let的变量不会被提升

 1 {
2 console.log(str1); //undedfined
3 var str1 = 12;
4 //等同于
5 var str;
6 console.log(str1);
7 str1 = 12;
8
9 console.log(str2); //报错 未定义
10 let str2 = 20;
11 //等同于
12 console.log(str2);
13 let str2;
14 str2 = 20;
15 }

3. let 不能重复声明

 1 {
2 var str1 = 12;
3 var str1 = 15;
4 console.log(str1); //15
5
6 let str2 = 20;
7 let str2 = 25;
8 console.log(str2); //报错 不能声明两个相同的变量
9
10 //整个内容一起运行的时候上边的代码不会执行结果,因为实在解析str2的时候出错的
11 }

4. let的父子作用域

//  假设有5个按钮
var btns = document.getElementsByTagName("button");


for (var i = 0; i < btns.length; i++) {
btns[i].onclick
= function (){
console.log(i);
//始终为5
}
}
// 如果要想实现显示点击的第几个要用到闭包
for (var i = 0; i < btns.length; i++) {
(
function(i){
btns[i].onclick
= function (){
console.log(i);
//从0开始点击那个显示第几个
}
})(i)
}

// 用let
let btns = document.getElementsByTagName("button");
for (let i = 0; i < btns.length; i++){
btns[i].onclick
= function (){
console.log(i);
//从0开始点击那个显示第几个
}
}

// 再看一个例子
for(let i = 0; i < 5; i++){
let i
= 20;
console.log(i); //20 输出5次 (如果改为var 只会输出一次20)
}

5. const(一般声明常量)

const 与let 类似,有几个相同点,就不在粘贴代码了

1)  只在当前代码块作用域中有效

2)  不会被提升

3)  不能重复声明

不同之处

1)声明的时候必须赋值如下

const name = "张三"
console.log(name);
// 下面这样会报错
const name;
name
= "张三";
console.log(name);
// 报错

2)声明的值不能修改(对象除外)

const name;
name
= "张三";
console.log(name);
// 报错

// 如果是对象的话可以修改,因为对象是存放的时堆内存
const obj = {
name:
"张三"
}
console.log(obj.name);
// 张三
obj.name = "李四";
console.log(name);
//李四