一、块级作用域
所谓“块”,就是大括号“{}”中间的语句。
ES5只有全局作用域和函数作用域,没有块级作用域,这带来了很多不合理的场景。
1、变量提升,导致内层变量覆盖外层变量。
var 是函数作用域。在整个函数中甚至是声明语句之前都是可用的。声明被提升。所以你能在声明之前使用一个变量。
2、用来计数的循环变量泄露为全局变量。
上面代码中i是var声明的,在全局范围内有效。每次循环,新的i值都会覆盖旧值,最后输出10。
上面代码定义的 i 只用来控制循环,但是循环结束后并没有消失,而是泄露成了全局变量。
所以ES6就有了let和const命令为JavaScript增加块级作用域。
上面代码中i是let声明的,当前的i只在本轮循环有效。所以每一次的循环i都是个新的变量,最后输出6。
所以for循环计数器很适合用let命令。
二、let和const命令
let命令的使用:
1、let不存在变量提升,变量一定要先声明后使用,否则会报错。
2、let命令声明变量之前,该变量都是不可用的,语法称为“暂时性死区”—即代码块开始,到变量使用之前的区间。
3、使用let命令声明的变量“绑定”在这个块级区域内,不再受外部影响,所以外层作用域无法读取内层作用域的变量。
4、let不允许在相同作用域内重复声明一个变量。
块级作用域的出现,使得立即执行匿名函数(IIFE)不再必要了。
const命令的使用
1、const用来声明常量,一旦声明,其值就不能改变。
2、对于const而言,只声明,不赋值就会报错。
3、const也不可以重复声明变量。