简单来说是: let是修复了var的作用域的一些bug,变的更加好用。let是更好的var。var的作用域是函数作用域由var定义的变量,它作用域在一个函数体内,而不是我们其他语言理解的大括号{ }内。而let是块级别(大括号括起来的内容)
const声明的变量只可以在声明时赋值,不可随意修改,这是最大的特点。
使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象;
使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升;
使用const声明的是常量,在后面出现的代码中不能再修改该常量的值。
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); //6
console.log(a[6]); // function(){console.log(i)}
既然循环结束后,数组a的每一项都是function(){console.log(i)},那么a[6]()输出是6是怎么实现的?难道let保存了10个状态?
这是因为 javascript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
var a = [];for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};}
a[6](); // 10
上面代码中,变量i是var命令声明的,在全局范围内都有效,所以全局只有一个变量i。每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i),里面的i指向的就是全局的i。也就是说,所有数组a的成员里面的i,指向的都是同一个i,导致运行时输出的是最后一轮的i的值,也就是 10。
也就是,循环结束后,数组a的每一项都是function(){console.log(i)}。在执行a[6]函数前,此时i的值已经是10了。