当浏览器加载HTML页面时,会产生一个供全局JS执行的环境——>全局作用域(window、global object),在js执行之前,浏览器会进行以下三个步骤:
1、语法分析;
2、预编译;
3、解析执行。
预编译:在当前作用域中,js执行之前浏览器默认会把带有var和function的声明进行提前的声明或定义,其中
var——>在预编译时只是进行提前声明,值为undefined
function——>在预编译时进行提前声明+定义
函数私有作用域预编译四部曲:
网络资源图片
全局作用域预编译:
1、创建GO对象(global object);
2、把带有var和function的声明进行提前的声明或定义
注意点:
1、预编译只对赋值表达式的左边起作用,等号右边的赋值不进行预编译,例如函数表达式的右边函数不在当前作用域进行预编译。
2、return后面的函数在当前作用域不进行预编译。
3、立即执行函数在当前作用域不进行预编译。
4、代码块内带有var的声明也会进行变量提升,无论条件是否成立,例如if语句中的var声明。