let是ECMA6中新增的标准,用来声明变量,我们知道在之前我们都只能用var来声明变量,但是var又有许多的缺点和不合理的地方,比如说存在变量提升的问题,即我们可以再变量声明之前调用这个变量,只不过他的返回值是undefined。而且由于js中只有函数作用域和全局作用域,所以我们使用var来定义的变量很容易污染到全局作用域。这时候let就是一个很好的声明变量的方式,let只会在自己的块级作用域中生效,他来到的同时也给我们带来了块级作用域这个概念。
{
var a = 10;
let b = 20;
}
上述函数中我们可以在快里调用到a与b,但是一但离开这个块,我们再也无法调用b,很显然let作为一个只在块级作用域中有效的声明变量的方式给我们带来了许多的方便。下面我们就来讲讲let。
1、基本用法:我们可以在if、for等类似的块中使用这个方式来声明变量,这样一来这个变量只会在这个块中有效,而不会因为被定义为全局变量而遭到别处的调用。用来定义计数器也是再好不过了.
2、let声明的变量不存在变量提升.。
这就是刚开始讲到的var的一个不合理的地方,在ES6中let改善了这个问题。当我们使用let来声明函数之后,我们无法在声明函数的那行代码之前调用或返回let声明的变量。如果调用会直接报错(referenceError)。这就是ES6中规定的只要块级作用域中存在let或者const这个块区对这些命令声明的变量,从一开始就形成了封闭的作用域。
3、暂时性死区:
只要块级作用域内存在let那么let的变量就会被绑定在这个块级作用域中,不会再受到外部的影响。总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
4、不允许重复声明:
let命令不允许在同一个作用域里重复声明一个变量。
5、块级作用域:
Es5中只有函数作用域和全局作用域,所以会导致许多不合理的场景,例如:内层的变量可能会覆盖外层的变量,用来计数循环的变量泄露为全局变量。而let的出现为js增加了块级作用域。,由于块级作用域的出现也就让许多匿名的立即执行函数没有存在的必要。(回调函数)
6、Es6中其实规定了在块级作用域中函数的声明语句行为,类似于let,所以在块级作用域外不可以引用。但是考虑到浏览器的环境差异大,所以我们只能尽量避免在块级作用域中使用或者尽量写成函数表达式的形式。
值得一提的是在Es6中块级作用域必须要有大括号,如果没有大括号js就会认为不存在块级作用域。