1、ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。但是,浏览器没有遵守这个规定,为了兼容以前的旧代码,还是支持在块级作用域之中声明函数
2、ES6 引入了块级作用域,明确允许在块级作用域之中可以声明函数;在块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。但是,如果真的在 ES6 浏览器中运行,是会报错的,因为为了兼职旧版本,ES6规定,浏览器的实现可以不遵守上面的规定(只对ES6浏览器实现),有自己的行为方式
- 允许在块级作用域内声明函数。
- 函数声明类似于
var
,即会提升到全局作用域或函数作用域的头部。 - 同时,函数声明还会提升到所在的块级作用域的头部。
根据这三条规则,在浏览器的 ES6 环境中,块级作用域内声明的函数,行为类似于
var声明的变量。
3、ES6 允许块级作用域的任意嵌套
4、ES6 的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。