本文共 1011 字,大约阅读时间需要 3 分钟。
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 defined9 //console.log(b) 输出 1
如上面的代码所示,在代码块外面访问 let 声名的变量 a 会提示 a 未定义。而var声名的变量b可以正常访问。
let 的特性使它特别适合用于循环计数,如下面的代码,出了循环以后,变量就失效,无法访问了。
1 for (let i = 0; i < 10; i++) {2 console.log(i); //会循环输出0到93 }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); //输出 910 }
在外部声名一个变量 i 为10,在第一个代码块内可以正常输出。第二个代码块基本上相同的代码,只不过在第一行输出语句后面又声名了 let i,这时第一行输出语句就报错了。但let 命令后的输出语句可以正常输出。
只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。上面代码中,存在全局变量 i,但是块级作用域内let
又声明了一个局部变量i
,导致后者绑定这个块级作用域,所以在let
声明变量前,对i输出
会报错。
在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)
转载地址:http://kqkwk.baihongyu.com/