|###执行环境:
执行环境是一个内置规范类型的对象(这种对象不能被编写代码所使用,仅仅是为了维护执行程序所产生的),这个对象与源代码文本中每一个可执行代码区域相关联(比如全局代码、函数代码、eval代码)。程序每当解析器开始进入一个可执行代码区域执行的时候,解析器就会创建一个和这个可执行代码区域相关的执行环境,并且将这个执行环境push到一个逻辑栈中。当把这个可执行代码区域的程序执行完毕之后,这个执行环境会从逻辑栈中pop出被垃圾回收器回收,但是和这个执行环境相关的创建的其他对象比如词法环境可能由于其他的对象对这个对象进行引用,所以还不能垃圾回收。
一个执行环境由如下组成:
组成 | 说明 |
---|---|
词法环境 | 指向一个词法环境对象,解析 该执行环境内代码创建的标识符的引用 |
变量环境 | 指向一个词法环境对象,保存 执行环境内通过变量和函数表达式创建的绑定 |
This绑定 | 与该可执行代码内this关键字相关联 |
当一开始创建执行环境的时候,词法环境和变量环境在一开始是指向的同一个此法环境对象。在代码执行过程中,词法环境会发生改变,变量环境不会发生改变。
对于不同的可执行代码如何建立执行环境,以及如何定义绑定初始化,和标识符如何进行解析这些问题将在后续探讨。
词法环境:
上面提到执行环境由词法环境对象组成,执行环境是与执行代码块相关联的内置规范类型对象。词法环境也是一个内置规范类型,只不过表述的是在这个执行代码块中变量和函数的绑定情形。
一个词法结构如下组成:
组成 | 说明 |
---|---|
环境记录项 | 实实在在记录了与这个词法环境所处的执行环境相关联的可执行代码块内变量和函数绑定到环境记录项中的情形。 |
外部词法环境 | 指向外部的词法嵌套结构 |
其中,环境记录项就是所说的作用域,这个目的就是将关联的代码中所有出现的变量和函数表达式绑定到环境记录项中。通过使用一个指针指向外部的词法环境,这就构成了作用域链。
环境记录项:
环境记录项分为两种,一种是声明式环境记录项,另一种是对象式环境记录项。他们都有一些公共的方法只不过实现方式不一样。
方法 | 作用 |
---|---|
HasBinding(N) | 判断环境记录项是否包含对某个标识符的绑定。如果包含该绑定则返回 true,反之返回 false。其中字符串 N 是标识符文本。 |
CreateMutableBinding(N, D) | 在环境记录项中创建一个新的可变绑定。其中字符串 N 指定绑定名称。如果可选参数 D 的值为true,则该绑定在后续操作中可以被删除。 |
SetMutableBinding(N,V, S) | 在环境记录项中设置一个已经存在的绑定的值。其中字符串 N 指定绑定名称。V 用于指定绑定的值,可以是任何 ECMA 脚本语言的类型。S 是一个布尔类型的标记,当 S 为 true 并且该绑定不允许赋值时,则抛出一个 TypeError 异常。S 用于指定是否为严格模式。 |
GetBindingValue(N,S) | 返回环境记录项中一个已经存在的绑定的值。其中字符串 N 指定绑定的名称。S 用于指定是否为严格模式。如果 S 的值为 true 并且该绑定不存在或未初始化,则抛出一个 ReferenceError 异常。 |
DeleteBinding(N) | 从环境记录项中删除一个绑定。其中字符串 N 指定绑定的名称。如果 N 指定的绑定存在,将其删除并返回 true。如果绑定存在但无法删除则返回false。如果绑定不存在则返回 true。 |
ImplicitThisValue() | 当从该环境记录项的绑定中获取一个函数对象并且调用时,该方法返回该函数对象使用的 this 对象的值。 |
声明式环境记录项与对象式环境记录项区别:
声明式环境记录项 | 对象式环境记录项 |
---|---|
就是一个通过解析器创建的内部对象(这个对象是内部创建的空的)在这个对象中可以添加一些与之关联的可执行代码中的变量和函数作为属性,并且有值和这些属性绑定在一起。 | 与一个代码创建的对象(这个对象是程序员创建好了的)相关联。然后与之关联的可执行代码中的变量和函数作为这个对象的属性与代码中定义的值绑定到一起。 |
函数定义语句和catch语句代码块内创建的是声明式环境记录项 | 全局代码、with语句代码块内创建的是对象式环境记录项。 |
对于ImplicitThisValue()在一定返回undefined。 | 对于ImplicitThisValue()如果这个环境记录项定义了属性provideThis为true那么将返回与之关联的对象否则返回undefined。 |
进入全局代码
当解析器开始执行代码之前,会为全局代码创建一个执行环境,这个执行环境中的this为全局对象,在意浏览器为载体的情况下,这个全局对象为window。词法环境和变量环境指向同一个词法环境,这个词法环境中环境记录项与全局对象相关联,所以这个环境记录项为对象式环境记录项。在后续的代码执行过程中会将全局中变量和函数的声明标识符作为全局对象的属性存在。外部的词法环境为null。