「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
定义:
JavaScript预编译是JavaScript内部执行的一个阶段
JavaScript是一门解释性语言,既编译完一段代码,执行一段代码
在内部具体执行时,大致有三个阶段:
1.语法分析
在进行代码运行时,会先扫描整个代码,查看是否有语法错误
2.预编译
在内存中开辟一些空间,存放一些变量与函数
3.解释执行
执行JavaScript代码
规则:
1.函数声明整体提升: 函数声明不管在哪个位置,系统总是会把声明提升到逻辑的最前面,因此无论函数调用在声明前或声明后结果都一样
2.变量声明提升: 会把变量的声明提升到函数调用前面
步骤:
预编译分为全局预编译和局部预编译(函数预编译),全局预编译发生在页面加载完成时执行,而局部预编译发生在函数执行的前一刻,二者都会先声明变量赋值,然后再声明函数赋值
全局预编译:
- 创建GO对象(Global Object),也就是全局对象。
- 找变量声明,将变量声明作为GO对象的属性名传进去,值为undefined
- 找函数声明,作为GO属性,值赋予对应的GO属性值
局部预编译:
- 创建AO对象(Activation Object)执行期上下文
- 找出形参和变量声明,将变量和形参名作为AO属性名,值为undefined
- 将实参值和形参统一
- 在函数体里面找函数声明,值赋予函数体
补充:
涉及JavaScript预编译比较多的就是变量提升了,简单说下几个规则:
- 只有声明的变量会提升,初始化的不会
- 函数及变量的声明都将被提升到函数的最顶部,而且不会被赋值
- 变量可以在使用后声明,也就是变量可以先使用再声明
- 提升先提升函数,然后提升变量