一、let
1、作用
与var
类似,用于声明一个变量
2、特点
-
无法重复声明
-
在块级作用域有效
-
会预编译,有变量提升,但是不能提前使用提升的变量
/* 无法重复声明 */
let a = 123
let a = 345 // 报错
3、let的变量提升
- 全局变量提升:会创建一个变量对象
Script
,用来收集全局作用域下 let 定义的变量,但是没有赋值 - 局部变量提升:会将
var let
定义的变量全部放到当前函数的变量对象中 - 与
var
变量提升的区别:let的变量提升,在为赋值无法使用
4、let的块级作用域
最著名的闭包问题,就是因为var
没有属于自己的块级作用域(函数级作用域)才会出现的,所以需要使用一个函数来包裹它,给它一个块级作用域
let btns = document.getElementsByTagName("button");
for(var i = 0; i < btns.length; i++) {
(function (i){
btns[i].onclick = function() {
console.log(i)
};
})(i)
}
但如果使用有块级作用域的变量let
,就不会出现这个问题了
let btns = document.getElementsByTagName("button");
for(let i = 0; i < btns.length; i++) {
btns[i].onclick = function() {
console.log(i)
};
}
二、const
1、作用
定义一个常量
2、特点
- 不能修改,(指无法修改指针指向)
- 和
let
相同
注意:
obj、array
使用const
定义的,是可以修改里面的元素的,因为并不会修改指针的指向