ES6学习-2 let

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

1 {
2   let a = 10;
3   var b = 1;
4 }
5 console.log(a);
6 console.log(b);
7 
8 //console.log(a) 输出 ReferenceError: a is not defined
9 //console.log(b) 输出 1

如上面的代码所示,在代码块外面访问 let 声名的变量 a 会提示 a 未定义。而var声名的变量b可以正常访问。

let 的特性使它特别适合用于循环计数,如下面的代码,出了循环以后,变量就失效,无法访问了。

1 for (let i = 0; i < 10; i++) {
2   console.log(i); //会循环输出0到9
3 }
4 
5 console.log(i); //报错 i is not defined,因为变量只在循环内有效。

let 命令挺简单,需要注意的事也不多,就两个。

1、在同一代码块内不能重复声名同名的变量

2、let 变量只能先声名后引用(这是句废话)

暂时性死区(好高大上的名称啊,咱用一个栗子说明白)

 1 var i=10;
 2 {
 3   console.log(i); //输出10
 4 }
 5 
 6 {
 7   console.log(i); //报错 ReferenceError: Cannot access 'i' before initialization
 8   let i=9;
 9   console.log(i); //输出 9
10 }

在外部声名一个变量  i 为10,在第一个代码块内可以正常输出。第二个代码块基本上相同的代码,只不过在第一行输出语句后面又声名了 let i,这时第一行输出语句就报错了。但let 命令后的输出语句可以正常输出。

只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。上面代码中,存在全局变量 i,但是块级作用域内let又声明了一个局部变量i,导致后者绑定这个块级作用域,所以在let声明变量前,对i输出会报错。

在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)

 

posted @ 2021-05-19 23:37  郭郭老师  阅读(74)  评论(0编辑  收藏  举报