一、声明提升
声明提升一般是
与其说函数声明优先级高,不如说函数声明覆盖能力强更为直观。
function a(){}
var a = 1;
console.log(a); // 1
二、函数作用域内的函数声明提升
观察以下代码:
function a(){
console.log('outer');
}
(() => {
// var a;
if (false) {
function a(){
console.log('inner');
}
}
// undefined
console.log(a);
})();
// outer
console.log(a);
函数内部访问a 为 undefined 的原因是,a声明提升到匿名函数内部作用域顶部 //var a;的位置。
作用域内提升函数,有很多坑。
上述情况在老ie中,是可以访问到 inner 的;也有部分浏览器是 outer。
chrome 与 node 表现一致。
三、块作用域内的声明提升
块作用域能够包裹标识符声明提升,但是函数还是会提升到块作用域外,因为函数作用域优先级高。
{
function a(){}
const b = function b(){};
}
console.log(a);
// b is not defined
console.log(b);
但在严格模式下,声明函数声明提升出不去块作用域。