Skip to content

预编译与执行代码 #3

Description

@homobulla
No description provided.

Activity

  1. homobulla commented on Mar 20, 2018

    @homobulla
    OwnerAuthor

    一段源代码在执行前会经过下面三个步骤:

    1. 分词/词法分析(Tokenizing/Lexing)
    2. 解析/语法分析(Parsing)
    3. 代码生成

    JavaScript执行代码会更加复杂,首先js引擎会对代码优化,代码会在执行之前进行编译。
    下面我们以var a = 1;来描述一下整个过程;
    首先,编译器会将其拆成词法单元,进而解析成树结构等;具体来说就是:
    编译过程中,解析器会将 var a = 1 分拆成 var a 和 a = 1 两句来执行; var a编译器会查找当前作用域是否存在 a,如果存在则忽略,否则会在当前作用域声明一个变量 a;接下来由引擎执行 a = 1,同样会首先在当前作用域内超找是否存在一个为 a 的变量,如果有则使用这个变量,也就是说把 1 赋值给它,倘若没有则继续向外层作用域超找,以此类推;若最终未找到,则报错;

    函数作用域:

    首先明白一个概念-> 执行期上下文,这个概念就是指代码的运行环境,也可以理解为作用域。
    Javascript中代码的运行环境分为以下三种:

    • 全局级别的代码 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境。

    • 函数级别的代码 当执行一个函数时,运行函数体中的代码。

    • Eval的代码 在Eval函数内运行的代码。

    一个函数,在其执行的前一刻,也就是预编译过程会经过以下四步:
    1:创建执行期上下文(AO对象====Activation Object),
    2:为AO对象添加属性(形参和已经申明的变量),并且其值为undefind,
    3:统一实参值和形参,
    4:找函数申明(不包括表达式赋值var a=function(){}),并且赋值.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions