首先看下面一段代码
const f = 11;
{
console.log(111,f)
if (false) {
function f() { console.log('I am inside!'); }
}
}
很简单,因为es6的浏览器会把if做为一个区块,所以函数提升止步于if区块内部,console打印的为最外层定义的f=11
但是问题来了,如果在函数作用域下情况发生了改变
const f = 11;
(function(){
console.log(111,f)
if (false) {
function f() { console.log('I am inside!'); }
}
}())
按照es6语法来说,应该也打印f为11才对,但是这里打印了undefined 如果在es5环境下,函数提升会穿透if的区块到达函数内,但是当es6定义了if也是一个区块的时候,这里就有了歧义,为了减轻兼容问题,浏览器的实现和es6的定义不同
参考 es6.ruanyifeng.com/#docs/let
- 允许在块级作用域内声明函数。
- 函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
- 同时,函数声明还会提升到所在的块级作用域的头部。
也就是说这里的实现是提升了一个var f = undefind穿透了出去,所以外面定义的f无效了