let
- 在ES5中,函数如果在块级代码里面声明,作用域也是在函数范围内,但在ES6中函数如果在块级作用域里面声明,则函数的生命周期相当于使用let声明,即块级作用域
function f() { console.log('I am outside!'); }
(function () {
if (false) {
// 重复声明一次函数f
function f() { console.log('I am inside!'); }
}
f();
}());
es5中,因为函数声明会自动提升,所以执行结果是 I am inside!
es6中,理论上会得到I am outside!
但是因为这种差别太大,因此在浏览器的实现(其他实现就是这样)中,并不是这样,而是
- 允许在块级作用域内声明函数。
- 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
- 同时,函数声明还会提升到所在的块级作用域的头部。
这样一来当在ES6中执行这段代码的时候,块级函数的声明被提升到前面 相当于 var f,这样一来就会报错 f is not a function