JS作用域(1)- 预编译

本篇文章开始说道js的作用域知识,本篇主要讲前奏的预编译。

JS执行三部曲

js的执行分为三步:

1. 语法分析

2. 预编译

3. 解释执行

语法分析:通篇分析程序是否有语法错误;解释执行:即读一句程序执行一句;而预编译作为一个很重要的环节,主要发生在程序执行之前的一刻,对于函数,预编译发生在函数执行之前,所以对于预编译来说,分成2部分:整个程序执行前的预编译和函数执行前的预编译,它们的过程是相同的,只是一个生成GO对象,一个生成AO对象。

预编译四部曲

1. 创建AO(Activation Object 执行期上下文)或GO(Global Object 全局执行期上下文,也即window对象)对象

2. 找形参和变量声明,将它们作为对象的属性名,值赋值为undefined

3. 将实参和形参统一(实参的值赋值给形参)

4. 找函数声明,将函数名作为对象属性,值赋值为函数体

以上即为预编译的四个步骤,下面做实例讨论:


1. 创建AO

AO = { };

2. 找形参和变量声明

AO = {

    a : undefined,

    c : undefined,

    b :undefined

};

3. 实参形参统一

AO = {

    a : 1,

    c : undefined,

    b :undefined

};

4. 找函数声明

AO = {

    a : function a(){},

    c : undefined,

    b :undefined,

    d : function d(){}

};

预编译完成后,执行函数,得到如下结果:


注意:

1. 条件语句对预编译生成AO或GO对象没有任何影响,里面的变量或函数声明依然会加到对象中;

2. 预编译是生成执行期上下文,在函数执行时,会进行上下文属性的赋值工作。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 函数: 封装代码实现某个功能,最初思路解决代码重复度高的问题,类似于变量(就是一个筐,往里面填充内容即可) 【编程...
    官清岁月阅读 332评论 0 0
  • 1、基本常识 浏览器的组成:1)shell部分 2)内核部分:(1)渲染引擎(语法规则...
    MrLsss阅读 340评论 0 4
  • 浏览器 主流浏览器IE TridentFirefox GeckoSaf...
    Gu1yun_张阅读 166评论 0 0
  • 画几幅彩铅
    vivigogogo阅读 204评论 0 1
  • 《EventBus使用详解(一)——初步使用EventBus》 《EventBus使用详解(二)——EventBu...
    AiPuff阅读 359评论 0 0