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)。

推荐阅读更多精彩内容

  • 为什么使用 ES6 ? 每一次标准的诞生都意味着语言的完善,功能的加强。JavaScript语言本身也有一些令人不...
    肖青荣阅读 143评论 0 4
  • 1. 预解析的相关概念 JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaS...
    itlu阅读 83评论 0 3
  • 1.var 定义的是变量,没有块作用域的概念,可以跨块作用域访问,不能跨函数访问 块级作用域由 { } 包括,if...
    onresize阅读 959评论 0 2
  • new在 Java中意思是”新的“,可以说是 Java 开发者最常用的关键字。在 Java 中 new 的操作往往...
    夏光辉阅读 204评论 0 5
  • this 关键字 是一个指针 this指向向当前所在函数的执行对象。 1.默认执行 (默认绑定) --------...
    许振宇_ed5a阅读 43评论 0 2