JavaScript在执行前发生了什么?——预编译过程详解

  从我们在打开页面后到JavaScript代码执行这之间发生了三件事。
  语法分析 -> 预编译 -> 解释执行

  其实在语法分析之前还可以继续深入,但是若继续深入则会涉及到词法分析以及AST(抽象语法树)等内容,这部分知识对于初学者来说过于深入,我们暂时从语法分析开始说明。

语法分析

  浏览器中的JavaScript引擎会对代码进行扫描,查找低级语法错误,发现错误后中断分析并抛出语法错误(syntaxError)。在引用了多个js文件时会继续对下一个js文件进行加载和扫描。没有语法错误则进入预编译阶段。

预编译

  1. 预编译分为全局预编译和函数预编译。
  2. 全局预编译在语法检测之前。
  3. 函数预编译在函数运行前进行。
全局预编译
  1. 在页面打开时便创建了一个全局对象GO(Global Object),即window对象。
  2. 分析变量声明,变量作为GO对象的属性名,值为undefined。
  3. 分析函数声明,函数名作为GO对象的属性名,值为函数体(如果遇到同名,直接覆盖)。
    全局预编译中需要注意的是函数声明遇到同名的变量声明后会对其进行覆盖。
函数预编译
  1. 函数执行前的一瞬间,生成一个AO对象。在函数执行前的一瞬间会生成自己的AO,如果函数执行2次,生成了两次AO,这两次的AO是独立的没有任何关联。
  2. 分析参数,形参作为AO对象的属性名,实参作为AO对象的属性值
  3. 分析变量声明,变量名作为AO对象的属性名,值为undefined,如果遇到同名的变量不去做任何改变。
  4. 分析函数声明,函数名作为AO对象的属性名,值为函数体,如果遇到同名的进行覆盖。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值