ECMAScript并不是一门能够独立运行的编程语言,它必须要接入到一个宿主环境(host environment) 中才能发挥作用。
ECMAScript有两种常见的宿主:
- web客户端的浏览器。
- web服务端的Node.Js
ECMAScript并不是一门能够独立运行的编程语言,它必须要接入到一个宿主环境(host environment) 中才能发挥作用。
ECMAScript有两种常见的宿主:
JavaScript必须依赖一个宿主环境才能实现完整的功能。
// 全局代码
const glo_const = 1
let glo_let = 2
var glo_var = 3
class Glo_class{}
function glo_fn(){ // ③
// 位于函数体内声明语句
let inner_fn_let = 4
var inner_fn_var = 5
}
if(true){ // ④
// 位于块内的声明语句
let block_let = 6 // ⑤
var block_var = 7 // ⑥
function block_fn(){} // ⑦
}
标准使用 环境记录器(Environment Record) 来表示作用域。
每个环境记录器都有一个 [[OuterEnv]] 字段指向另一个环境记录器,通过该字段连接起来的所有的环境记录器共同构成一条作用域链。
作用域链例子
for (var i = 1; i < 5; i++) {
setTimeout(() => {
console.log(i)
}, i * 1000)
}
表示没有产生式的元素,无法继续展开,在ECMA中使用黑色粗体表示。
十六进制字面量产生式
HexIntegerLiteral :: 0x HexDigits
0x和::为非终结符
字符串文本是 0 个或多个 Unicode 码位,用单引号或双引号括起来。
Unicode 码位也可以由转义序列表示。除右引号代码点 U+005C (REVERSE SOLIDUS)、U+000D (回车) 和 U+000A (换行) 之外,所有代码点都可以直接出现在字符串文本中。
任何码位都可以以转义序列的形式出现。String 文本的计算结果为 ECMAScript String 值。生成这些 String 值时,Unicode 码位将按照 11.1.1 中的定义进行 UTF-16 编码。
ECMA是一个js标准,他只提供抽象定义,具体实现取决于实际环境。例如Node和浏览器环境就有不同的全局对象。
阅读ECMA有以下难点:
本文只对ECMA的内容进行简单的介绍,具体需要看术语部分。
在运行时调用的算法(指定语义)称为运行时语义。运行时语义由抽象操作(abstract operations)或语法导向操作(Syntax-Directed Operations)定义。
以下的是一般运行时语义。
抽象操作完成接受参数completionRecord(一个完成记录),并返回一个完成记录(规范类型)。此操作用于强调正在返回一个完成记录。在被调用时,它执行以下步骤:
语法导向操作是一系列算法的总和,与产生式绑定。在标准中文法定义了语句的结构,其语义通过语法导向操作进行表达。一条产生式可以绑定多条语法导向操作。
每条产生式的目标符实例都可以通过调用自身的语法导向操作,执行这些逻辑,完成语句语义的表达。
重要
语法导向操作和抽象操作有两种类型: