JS运行三部曲
1、语法分析(检查是否有语法错误,这一阶段不会执行语法)
2、预编译(这个阶段出现在代码执行的前一刻,在内存里边创建一个空间,用来存储定义的变量和函数)
3、解释执行(从上到下依次执行函数代码)
预编译的一些知识点:
- 函数声明整体提升(函数声明无论写在哪里,系统都会将其提升到逻辑最前面)
- 变量仅声明提升
- Imply global暗示全局变量(任何变量如果未经声明)
- 一切声明的全局变量都是window的属性
变量提升
//常规做法
var num = 123;
console.log(num);//结果为123
//非常规做法
console.log(num);//结果为undefined,其实会默认在这一行上边添加一行var num = undefined;只是我们看不见
var num = 123;
///函数/
function fn() {
console.log("你好!")
}
fn();//调用这个函数,会打印出:你好!
//如果我们将fn()放在定义函数之前,也会打印出你好!不会报错
变量提升规则:
函数声明整体提升:无论函数调用和声明的位置是前还是后,系统总会把函数声明移动到调用前面
变量声明提升:无论变量调用和声明的位置是前还是后,系统总会把变量声明移动到调用前面,由于只是声明,所以具体值是undefined,只有在解释执行阶段才会进行变量初始化。匿名函数不参与预编译。
Global Object 和Activation Object
JS在执行前会产生一个GO,也就是我们说的全局作用域。当方法被调用的时候会形成一个局部作用域AO
预编译的执行步骤
AO对象的过程如下(函数预编译):
- 创建AO对象
- 寻找函数的形参和变量声明,将变量和形参名作为AO对象的属性名,值设定为undefined.
- 将形参和实参相统一,即将改变形参后的undefined为具体的形参值。
- 寻找函数中的函数声明,将函数名作为AO属性名,值为函数体。
GO对象的过程如下(全局预编译):
- 创建GO对象
- 寻找变量声明,值设定为undefined。
- 寻找函数中的函数声明,将函数名作为GO属性名,值为函数体
综合案例–全局和局部的预编译和解释执行过程
**
过程描述
**
全局预编译三部曲
- 创建GO对象 GO={}
- 找变量声明作为GO属性名,值为undefined
- 找函数声明,值赋予函数体
局部预编译四部曲 - 创建AO对象 AO{}
- 找形参和局部变量声明,值为undefined
- 形参和实参相统一
- 找函数声明,值赋予函数题
注:部分内容参考网络,仅用于本人学习,侵删