JavaScript中var和let定义变量的区别

在ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
先看一段代码,用var定义变量:

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); 

Paste_Image.png

再看用let定义变量:

   let  a = [];
    for (let i = 0; i < 10; i++) {
        a[i] = function () {
            console.log("a[6]的值为:"+i);
        };
    }
    a[6](); 

Paste_Image.png

同样是两个for循环计数器,用var定义的输出的结果是10,而用let定义的输出结果是6.
原因就在于:
1、用var声明的变量,在全局范围内都有效。所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i的值。
2、用let声明的变量,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。

在用var声明变量时可以在声明之前使用,值为undefined,而let声明变量时,它所声明的变量一定要在声明后使用,否则报错。只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

推荐阅读更多精彩内容