第 1 章 二十年来的 JavaScript 1
1.1 网页中的代码1
1.1.1 新鲜的玩意儿 1
1.1.2 写在网页中的第一段代码 2
1.1.3 最初的价值 3
1.2 用 JavaScript 来写浏览器上的应用5
1.2.2 Flash 的一席之地 7
1.2.3 RWC 与 RIA 之争 8
1.3 没有框架与库的语言能怎样发展呢 10
1.3.1 做一个框架10
1.3.2 重写框架的语言层 .13
1.3.3 富浏览器端开发(RWC)与 AJAX14
1.4 语言的进化16
1.4.1 Qomo 的重生16
1.4.2 QoBean 是对语言的重新组织 .17
1.4.3 JavaScript 作为一门语言的进化18
1.5 大型系统开发20
1.5.1 框架与架构是不同的 .20
1.5.2 大型系统与分布式的环境 21
1.5.3 划时代的 ES6.23
1.6 为 JavaScript 正名 24
1.6.1 JavaScript .25
1.6.1.1 Core JavaScript26
1.6.1.2 SpiderMonkey JavaScript 27
1.6.1.3 JScript .27
1.6.2 ECMAScript 28
1.7 JavaScript 的应用环境29
1.7.1 宿主环境 30
1.7.2 外壳程序
第 2 章 JavaScript 的语法 36
2.1 语法综述 36
2.1.1 标识符所绑定的语义.37
2.1.2 识别语法错误与运行错误38
2.2 JavaScript 的语法:声明 .40
2.2.1 变量的数据类型.40
第 2 章 JavaScript 的语法 . 36
2.1 语法综述36
2.1.1 标识符所绑定的语义 37
2.1.2 识别语法错误与运行错误 .38
2.2 JavaScript 的语法:声明40
2.2.2 变量声明 45
2.2.4 其他声明 53
2.2.4.1 常量声明 ..53
2.2.4.2 符号声明 ..54
2.2.4.3 函数声明 ..55
2.3 JavaScript 的语法:表达式运算 ......56
2.3.1 一般表达式运算 .....59
2.3.2 比较运算 61
2.3.3 赋值运算 67
2.3.4 函数相关的表达式 .6
2.3.5 特殊作用的运算符 .72
2.3.6 运算优先级 ...76
2.4 JavaScript 的语法:语句 ....78
2.4.1 表达式语句 ...80
2.4.2 变量声明语句 ..86
2.4.3 分支语句 87
2.4.4 循环语句 89
2.4.5 流程控制:一般子句 ....91
2.4.6 流程控制:异常 .....96
2.5 JavaScript 的语法:模块 ....97
2.5.1 模块的声明与加载 .98
2.5.2 名字空间的特殊性 ......101
2.6 严格模式下的语法限制 ...105
2.6.1 语法限制 .....106
2.6.2 执行限制 .....108
2.6.3 严格模式的范围 ... 110
2.7 运算符的二义性 ..... 112
2.7.1 加号“+”的二义性 .... 114
2.7.2 括号“( )”的二义性 ... 114
2.7.3 冒号“:”与标签的二义性 116
2.7.4 大括号“{ }”的二义性 ..... 117
2.7.5 逗号“,”的二义性 .....122
2.7.6 方括号“[ ]”的二义性 ......123
2.7.7 语法设计中对二义性的处理.....127
第 3 章 JavaScript 的面向对象语言特性 . 130
3.1 面向对象编程的语法概要 ......130
3.1.1 对象声明与实例创建 ..132
3.1.2 使用类继承体系 ...141
3.1.3 对象成员 .....147
3.1.4 使用对象自身 157
3.1.5 符号 ......158
3.2 JavaScript 的原型继承 ......161
3.2.1 空(null)与空白对象(empty) ......161
3.2.2 原型链的维护 171
3.2.3 原型继承的实质 ...175
3.3 JavaScript 的类继承 179
3.3.1 类是静态的声明 ...179
3.3.2 super 是全新的语法元素 ....181
3.3.3 类是用构造器(函数)来实现的 189
3.3.4 父类的默认值与 null 值 .....192
3.4 JavaScript 的对象系统 ......196
3.4.1 封装与多态 .196
3.4.2 属性 ......201
3.4.3 构造对象系统的方法 ..206
3.4.4 内置的对象系统 ...214
3.4.5 特殊效果的继承 ...226
3.5 可定制的对象属性 .229
3.5.1 属性描述符 .230
3.5.2 定制对象属性 233
3.5.3 属性表的状态 239
3.6 运行期侵入与元编程系统 ......242
3.6.1 关于运行期侵入 ...243
3.6.2 类类型与元类继承 ......257
3.6.3 元编程模型 .266
第 4 章 JavaScript 语言的结构化 ..... 269
4.1 概述 ....269
4.1。1 命令式语言 .270
4.1.2 面向对象语言 275
4.1.3 再论语言的分类 ...281
4.1.4 JavaScript 的语源 ..283
4.2 基本的组织元素 .....284
4.2.1 标识符 ..285
4.2.2 表达式 ..286
4.2.3 语句 ......288
4.2.4 模块 ......289
4.2.5 组织的原则 .290
4.3 声明 ....294
4.3.1 声明名字 .....295
4.3.2 确定性 ..296
4.3.3 顶层声明 .....297
4.4 语句与代码分块 .....300
4.4.1 块 ...301
4.4.2 块与语句的语法结构 ..303
4.4.3 块与声明语句 309
4.4.4 块与语句的值 312
4.5 组织形式分块的方法 318
4.5.1 词法作用域 .319
4.5.3 词法作用域之间的相关性 .336
4.5.4 执行流程变更的内涵 ..337
4.6 层次结构程序设计 .340
4.6.1 属性的可见性 341
4.6.2 多态的逻辑 .343
4.6.3 私有作用域的提出 ......347
4.7 历史遗产:变量作用域 ...349
4.7.1 变量作用域 .350
4.7.2 变量的特殊性与变量作用域的关系 353
4.8 私有属性与私有字段的纷争356
4.8.1 私有属性的提出 357
4.8.2 从私有属性到私有成员 361
4.8.3 “类字段”提案的实现概要364
4.8.4 “私有属性”提案的设计与提议 368
4.8.5 “私有属性”提案的实现 .373
第 5 章 JavaScript 的函数式语言特性 ..... 381
5.1 概述 ....381
5.1.1 从代码风格说起 ...382
5.1.2 为什么常见的语言不赞同连续求值 ...383
5.1.3 函数式语言的渊源 ......384
5.2 从运算式语言到函数式语言...386
5.2.1 JavaScript 中的几种连续运算 ...386
5.2.2 如何消灭语句 391
5.2.3 运算式语言 .394
5.2.4 重新认识函数 397
5.2.5 函数式语言 .401
5.3 JavaScript 中的函数 405
5.3.1 参数 ......405
5.3.2 函数 ......418
5.3.3 函数的数据性质 ...431
5.3.4 函数与逻辑结构 ...439
5.4 函数的行为 ......443
5.4.1 构造 ......444
5.4.2 调用 ......448
5.4.3 方法调用 .....455
5.4.4 迭代 ......461
5.4.5 生成器中的迭代 ...466
5.5 闭包 ....475
5.5.1 闭包与函数实例 ...476
5.5.2 闭包的使用 .481
5.5.3 与闭包类似的实例化环境 .487
5.5.4 与闭包相关的一些特性 .....496
第 6 章 JavaScript 的动态语言特性 . 506
6.1 概述 ....506
6.1.1 动态数据类型的起源 ..507
6.1.2 动态执行系统 507
6.1.3 脚本系统的起源 ...509
6.1.4 脚本只是表现形式 ......510
6.2 动态类型:对象与值类型之间的转换 .512
6.2.1 包装类:面向对象的妥协 .512
6.2.2 从对象到值 .520
6.2.3 显式的转换 .529
6.3 动态类型:值类型的转换 ......532
6.3.1 值运算:类型转换的基础 .532
6.3.2 值类型之间的转换 ......535
6.3.3 值类型之间的显式转换 .....540
6.4 动态类型:对象与数组的动态特性 .....545
6.4.1 关联数组与索引数组 ..545
6.4.2 索引数组作为对象的问题 .546
6.4.3 类数组对象:对象作为索引数组的应用 ..552
6.4.4 其他 ......554
6.5 重写 ....555
6.5.1 标识符的重写及其限制 .....555
6.5.2 原型重写 .....567
6.5.3 构造器重写 .569
6.5.4 对象成员的重写 ...573
6.5.5 引擎对重写的限制 ......578
6.6 动态执行 ...582
6.6.1 eval()作为函数名的特殊性 582
6.6.2 eval()在不同上下文环境中的效果 .....584
6.6.3 Eval 环境的独特性 ......586
6.6.4 动态执行过程中的语句、表达式与值 ......593
6.6.5 序列化与反序列化 ......595
6.6.6 eval 对作用域的影响 ...600
6.6.7 其他的动态执行逻辑 ..601
6.7 动方法调用(call、apply 与 bind) .605
6.8 通用执行环境的实现 615
6.8.1 通用 DSL 的模型 ..616
6.8.2 实现 ECMAScript 引擎 ......624
6.8.3 与 DSL 的概念整合 .....635
第 7 章 JavaScript 的并行语言特性 . 638
7.1 概述 ......638
7.1.1 并行计算的思想 ...638
7.1.2 并行程序设计的历史 ..642
7.1.3 并行语言特性在 JavaScript 中的历史 645
7.2 Promise 的核心机制 ..647
7.2.1 Promise 的核心过程 ....647
7.2.2 Promise 类与对象的基本应用 ..654
7.2.3 Promise 的子类 .....663
7.2.4 执行逻辑 .....666
7.2.4.1 任务队列 666
7.2.4.2 执行栈 ....667
7.3 与其他语言特性的交集 ...668
7.3.1 与函数式特性的交集:异步的函数 ...669
7.3.2 与动态特性的交集 ......677
7.3.3 对结构化特性带来的冲击 .683
7.3.3.4 异步方法与存取器 .....687
7.4 JavaScript 中对并发的支持 .....690
7.4.1 Agent、Agent Cluster 及其工作机制 ..691
7.4.2 SharedArrayBuffer 698
7.4.3 Atomics.701
7.5 在分布式网络环境中的并行执行 ..706
7.5.2 构建一个集群环境 ......709
7.5.3 使用 PEDT 执行行任务 .713
7.5.4 可参考的意义 718
附录 A 术语表 ... 719
附录 B 参考书目 ...... 723
附录 C 图表索引 ...... 725
附录 D 本书各版次主要修改 .. 731