JS学习笔记

JS作用域(1)- 预编译

2018-10-30  本文已影响0人  zh2443

本篇文章开始说道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. 预编译是生成执行期上下文,在函数执行时,会进行上下文属性的赋值工作。

上一篇下一篇

猜你喜欢

热点阅读