ECMAScript 整理(下)

阅读数:1058 发布时间:2016-09-28 21:40:16

作者:w4gyc 标签: ECMAScript

ECMAScript 整理(下)

六、词法约定

1、输入元素 InputElement

ECMA的源代码首先被扫描成一个个输入元素。ECMA定义了两种输入元素:InputElementDiv 和 InputElementRegEXP,分别如下

*InputElementDiv ::

空白符 WhiteSpace

注释 Comment

Token

行终结符 LineTerminator

DivPunctuator

inputElementRegEXP::

WhiteSpace Comment

Token

LineTerminator

RegularExpressionLiteral*

因为除法运算符和正则表达式都用了/ ,在词法分析阶段ECMA无法区分二者,所以词法分析有两种状态,一种扫描InputElementDiv,一种扫描 InputElementRegEXP

2、Token

Token是ECMA所能理解的最小语义单元,包括。

Token::
        IdentifierName 
        Punctuator 
        NumericLiteral
        StringLiteral

3、自动插分号机制

当有换行符(包括含有换行符的多行注释),并且下一个token没法跟前面的语法匹配时,会自动补分号。

当有}时,如果缺少分号,会补分号

当程序源代码结束时,如果缺少分号,会补分号。

举例说明:

img7

++ 或 — 应和其操作数出现在同一行。

return 或 throw 语句中的表达式应和return 或 throw 出现在同一行。

break 或 continue 语句中的标签应和break 或 continue 出现在同一行。

Q: 这一章也理解无力。。。词法分析的两种状态是什么意思?

七、类型

1、ECMA中的规定类型:

原始类型:Undefined Null Number String Boolean

对象类型:Object (这两者构成了ECMA的语言类型)

特定类型: Reference、List、Completion、Property Descriptor、 Property Identifier Lexical Environment, Environment Record

特定类型是引擎进行底层操作时运到的,无法被访问到)

2、Object

对象是一系列属性的无序集合。每个属性可以是以下三者之一:命名数据属性、命名访问器属性、内部属性。

数据属性:包括属性名、value和一系列布尔值( Attributes)。就是我们通常用的属性。比如 var obj ={ name : 'misa'};

访问器属性:包括属性名、一或两个访问器函数和一系列布尔值。比如

img8

内部属性:没有名字,且不能直接通过 ECMA 语言操作。内部属性的存在纯粹为了规范的目的。内部属性的名称比较特殊,它们都被两个中括号包围着.下面有两个例子:

3、 属性特性 Property Attributes

此处对它的定义是 "Attributes are used in this specification to define and explain the state of named properties." 属性是用来解释有名字的属性(即内部属性除外)的状态的。" 再次看一下4.2对 attributes的定义,原文如下:"An ECMAScript object is a collection of properties each with zero or more attributes that determine how each property can be used—for example, when the Writable attribute for a property is set to false, any attempt by executed ECMAScript code to change the value of the property fails. "一个ECMAScript 对象是若干个属性(每个属性都有0或多个attributes来决定该属性的使用方法)的集合。比如,当一个属性的Writable attribute被设置为false ,任何试图修改该属性值的代码将不会起作用)。

好,解释的很清晰,attributes是用来控制属性的状态,相当于“属性的属性”。

data property的attributes有以下几个:[[Value]] 返回属性的值。[[Writable]] 布尔值,描述属性是否可写。[[Enumerable]]布尔值。描述属性是否可枚举(for in)。[[Configurable]]布尔值。描述该属性除[[value]]之外的attributes是否可控。

accessor property的attributes有以下几个:[Get]][[Set]] function object或undefined.调用内部方法[[call]]返回/设置值。[[Enumerable]][[Configurable]]同上。(默认的值是undefined和false)

4、特定类型

Reference、List、Completion无法直接访问,是由引擎进行底层操作时需要用到的数据类型。Reference是用来判定this值,以及typeof和delete操作符需要的数据类型;List是利用构造函数创建新的对象时,记录传入函数中的参数的;Completion是用来解释breakcontinue eturn hrow这些可以改变当前运行环境的语句需要的数据。

属性描述符可以将一个属性的所有特性编码成一个对象并返回.该对象的每个属性都对应着所属属性的一个特性

5、类型转换和测试

ECMAScript运行时会按照需要自动进行类型转换,可以接收除特定类型之外的任何类型。ToPrimitive:转换成原始类型,以下一系列转换规则。一般性了解。用的比较多的ToString/ToNumber isCallable:判断是否为可调用对象.SameValue 严格比较运算

八、Executable Code and Execution Contexts 可执行代码和执行环境

很重要的一章,阐述了ECMA的执行机制。对于理解某些函数的运行结果、闭包、this等至关重要。

  1. 可执行代码:如字面含义。有三种:全局代码,eval代码,函数代码。全局代码即<script>标签里非函数体的代码。eval代码是eval函数内的语句块。函数代码不包括嵌套的函数。

  2. 什么是执行上下文(又叫执行环境):是阐述ECMAScript的如何执行的一个体系,一种机制。在逻辑上可表现为一个Stack。程序首次进入<script>时会创建一个堆栈,每进入一个可执行代码,即会push进一个执行上下文,当执行完这段代码时,把它pop掉。(当前活动 的代码块永远在栈的顶端)。ECMAScript执行时会首先push一个全局执行环境,进入到函数代码后再push进该函数的执行上下文,以此类推。执 行环境由词法环境、变量环境和this绑定组成。变量环境用来记录函数传参的数据,所有全局执行环境没有变量环境。

  3. 词法环境:Lexcial Environments。词法环境是可执行上下文的组成部分之一。它由环境记录和外部环境指针组成。环境记录是用来记录执行环境的变量、语句的。(变量 与值以一一对应的形式存储。例如:在function a(){var a=1;}在执行环境里的表现形式,是给函数a的环境记录的a属性赋值为1。)外部环境指针是用于表现函数的嵌套形式的,在整个执行环境中是一个链表的形 式,它牵扯到闭包的概念。(例如:function a()的内部函数function b(),则b的外部环境指针指向a的词法环境,a的外部环境指针指向全局词法环境)。

相关文章推荐: