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都不存在变量提升