2018-12-20 | Js从定义到执行的那些事 | UNLOCK

Js从定义到执行的那些事

一、(执行前)执行前准备

1. 初始化变量 (也可以理解为浏览器在解析代码的时候,进行变量提升)

2. 创建一个全局对象Function

  • 所以也就解释了为啥会说Function创建了所有对象

  • 它存在于应用程序的整个生命周期

  • 并且在创建全局对象的同时,将Math,String,Date,document 等常见的js对象作为该对象的属性

  • 另外,因为这个全局对象是个虚拟的,无法通过名字访问它,所以产生了一个另外一个属性 Window ,作为其代理。访问全局对象

3. 同时,js引擎会创建一个执行环境,同时,也会创建一个全局环境

  • 这个全局环境也可以称之为全局作用域,而全局环境又处于这个执行环境栈中

  • 执行环境栈的作用 (保证代码按照特定的顺序依次解析)

4. 当执行函数的时候,该函数的执行环境会被堆到执行环境栈的顶部获得执行权,执行完毕之后,该函数的执行环境会从执行环境栈中删除

  • 这也就可以解释之前为啥会说函数中的变量的生命周期只有在函数执行的时候才会存在

5. 最后会创建一个与全局对象想关联的全局变量对象Object,指向该全局对象

  • 也可以理解为Function创造了Object ,该全局变量对象Object不仅包含全局对象所有的属性,还包含全局定义的变量跟函数

6. 在创建函数的时候,会同时为其配备一个内部属性scope(作用域)并且scope指向Object

  • 每个函数定义的时候,都会创建一个与之关联的scope属性,该scope总是指向定义函数所存在的环境

二、(执行)在执行函数 A 的时候

1. js会创建一个该函数的执行环境,并将其推到执行环境栈中获得执行权

2. 此时执行环境栈中,有两个东西,一个是该函数的执行环境在栈顶,另外一个全局执行环境存在栈底

  • 接着js会创建一个该函数的作用域链,用于标识符解析

3. 当执行环境被创建时,它的作用域链就初始化为当前运行函数的scope所包含的对象。

  • 然后会创建该执行函数的活动对象(这里的活动对象充当着变量对象的角色)

4. 该活动对象包含了函数的形参,arguments对象,this对象以及局部变量和内部函数的定义

5. 然后该活动对象会被推到作用域链的顶部(如果在该函数的内部定义了另外一个函数B的时候)

6. 同样会为函数B创建一个scope属性,并将其指向函数B所在的环境内

7. 函数B的环境就是函数A的活动对象 【活动对象处于链表的顶端 ,该链表具有收尾相连的特性】

8. 函数B的scope属性会指向函数 A 的作用域链

评论加载中