let为JS新增了块级作用域,见代码:
![](https://i-blog.csdnimg.cn/blog_migrate/dec84f2ea4c372de830c7166499634aa.png)
ES6允许块级作用域允许任意嵌套,见代码:
![](https://i-blog.csdnimg.cn/blog_migrate/a0c057ee037ca38647c597e83664b82e.png)
外层作用域无法读取内层作用域的变量,见代码:
![](https://i-blog.csdnimg.cn/blog_migrate/34a0fe02d23d4e0845d19131f40d42ba.png)
内层作用域可以定义外层作用域的同名变量,:见代码:
![](https://i-blog.csdnimg.cn/blog_migrate/f3dab2ec1b12832f9d2c17fc166681e8.png)
块级作用域的出现使得立即执行匿名函数(IIFE)不在必要,见代码:
![](https://i-blog.csdnimg.cn/blog_migrate/60ca2a35055abdeaefcb6eb982f09837.png)
块级作用域与函数声明
ES6的规定
允许在块级作用域内声明函数
函数声明类似于var,即会提升到全局作用域或函数作用域的头部
同时,函数声明还会提升所在块级作用域的头部
块级作用域声明函数的规则只在使用大括号的情况下成立,若没有大括号就会报错,见代码:
![](https://i-blog.csdnimg.cn/blog_migrate/fd55cb73e521f8ff536d6fe1c6c0690d.png)
因为环境导致的行为差异过大应避免在块级作用域中声明函数,若确实需要可以采用函数表达式的形式,见代码:
![](https://i-blog.csdnimg.cn/blog_migrate/63e785aa5f690c56b2e1fc859f4b228c.png)
do表达式
本质上,块级作用域是一个语句,将多个语句封装在一起,没有返回值,在作用域外不能访问里面的值,因为作用域不返回值,对于这种情况可以使用do关键字,使它变成do表达式,见代码:
![](https://i-blog.csdnimg.cn/blog_migrate/d23d75e7d49679928b0f9d2e450a7c60.png)