美文网首页JS学习笔记
JS作用域(1)- 预编译

JS作用域(1)- 预编译

作者: zh2443 | 来源:发表于2018-10-30 22:55 被阅读0次

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

    相关文章

      网友评论

        本文标题:JS作用域(1)- 预编译

        本文链接:https://www.haomeiwen.com/subject/cdwntqtx.html