var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量提升 | 无变量提升 | 无变量提升 |
值可修改 | 值可修改 | 值不可修改 |
let arr = [];
for (let i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0]();//输出为0
arr[1]();//输出为1
for循环时每次都会生成一个块级作用域,使用let,则每个块级作用域保留当前的let值,因此能够输出for循环对应的let值
var arr = [];
for (var i = 0; i < 2; i++) {
arr[i] = function () {
console.log(i);
}
}
arr[0]();//输出为2
arr[1]();//输出为2
var声明的变量在整个函数都有效,调用i时会输出最终的i的值,为2。
const PI = 3.14;
PI = 100;
const ary = [100, 200];
ary[0] = 123;
ary = [1, 2]
console.log(ary);
对于简单数据类型,const 声明的值不能修改,对于复杂数据类型,const 声明的数据的地址无法进行修改,但是可以改变数据内的值,如数组
此外let会造成暂时性死区
let只有先声明之后才能使用数据
var num = 10
if (true) {
console.log(num);//Cannot access 'num' before initialization,let没有初始化
let num = 20;
}