代码如下:
var f=function (){return true};
var g=function (){return false};
(function(){
console.log(g);//undefined
if(true){
f=function(){return false};
function g(){return true};
}
})();
console.log(f());
console.log(g());
问题是:我理解的函数声明提升是整体提升,那么在if判断语句中的g函数应该整体提升到立即执行函数里作用域的顶部,那么控制台输出应该是一个函数,但是使用控制台打印g,输出了undefined。现在有点疑惑,函数声明提升的规则是什么?
ecma262 里函数声明是块级的,而不是函数级的,跟 var 不一样。所以在外面就是 undefined 。
但是由于历史原因(浏览器对块级函数的支持早于 ecma262),各大浏览器对这个处理不大一样,参见MDN