let和var有哪些区别
举个例子
var arr = [];
for(var i = 0; i < 2; i++){
arr[i] = function () {
console.log(i);
}
}
arr[0](); //2
arr[1](); //2
打印结果两次都为2
当把所有的var改成let
let arr = [];
for(let i = 0; i < 2; i++){
arr[i] = function () {
console.log(i);
}
}
arr[0](); //0
arr[1](); //1
打印结果为
总结
第一段代码中函数在执行时,是找不到变量i的值的,所以要往上一层作用域中找 他的上一层作用域是全局作用域,也就是不符合循环条件的值 为 2
第二段代码中函数在执行时,他的上一级作用域是块级作用域,通过let声明依次生成了两个块级作用域,因此arr[0]();
和 arr[1]();
依次在他们各自的块级作用域中找变量i,分别为0和1
由此可以得出结论
var 和 let 第一点不同就是 let 是块作用域,即其在整个大括号 {} 之内可见。如果使用 let 来重写上面的 for 循环的话,会报错 var:只有全局作用域和函数作用域概念,没有块级作用域的概念。但是会把{}内也假称为块作用域。 let:只有块级作用域的概念 ,由 { } 包括起来,if语句和for语句里面的{ }也属于块级作用域。
另外const特点
const声明的变量也具有块级作用域且必须赋值且不可更改他的值(
这里指数据内存地址
)
复杂数组可以通过数组下标的方式arr[i]更改,但不可以重新声明赋值,这样会改变内存地址
let和const都不存在变量提升