JS预编译

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对象的过程如下(函数预编译):

  1. 创建AO对象
  2. 寻找函数的形参和变量声明,将变量和形参名作为AO对象的属性名,值设定为undefined.
  3. 将形参和实参相统一,即将改变形参后的undefined为具体的形参值。
  4. 寻找函数中的函数声明,将函数名作为AO属性名,值为函数体。

GO对象的过程如下(全局预编译):

  1. 创建GO对象
  2. 寻找变量声明,值设定为undefined。
  3. 寻找函数中的函数声明,将函数名作为GO属性名,值为函数体

综合案例–全局和局部的预编译和解释执行过程
综合案例
输出结果
**

过程描述

**
全局预编译三部曲

  1. 创建GO对象 GO={}
  2. 找变量声明作为GO属性名,值为undefined
    找变量声明作为GO属性名
  3. 找函数声明,值赋予函数体
    找函数声明
    局部预编译四部曲
  4. 创建AO对象 AO{}
  5. 找形参和局部变量声明,值为undefined
    找形参和局部变量声明
  6. 形参和实参相统一
    实参和形参相统一
  7. 找函数声明,值赋予函数题
    找函数声明
    解释执行
    注:部分内容参考网络,仅用于本人学习,侵删
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值