第1部分 語言基礎 1
第1章 十年JAVASCRIPT 3
1.1 網頁中的代碼 3
1.1.1 新鮮的玩意兒 3
1.1.2 第一段在網頁中的代碼 4
1.1.3 最初的價值 5
1.2 用JAVASCRIPT來寫瀏覽器上的應用 6
1.2.1 我要做一個聊天室 6
1.2.2 Flash的一席之地 9
1.2.3 RWC與RIA之爭 10
1.3 沒有框架與庫的語言能怎樣發(fā)展呢? 12
1.3.1 做一個框架 12
1.3.2 重寫框架的語言層 15
1.3.3 富瀏覽器端開發(fā)(RWC)與AJAX 16
1.4 為JAVASCRIPT正名 18
1.4.1 JavaScript 18
1.4.2 Core JavaScript 19
1.4.3 SpiderMonkey JavaScript 20
1.4.4 ECMAScript 20
1.4.5 JScript 21
1.4.6 總述 21
1.5 JAVASCRIPT的應用環(huán)境 22
1.5.1 宿主環(huán)境(host environment) 23
1.5.2 外殼程序(Shell) 24
1.5.3 運行期環(huán)境(runtime) 25
第2章 JAVASCRIPT的語法 27
2.1 語法綜述 27
2.1.1 標識符所綁定的語義 28
2.1.2 識別語法錯誤與運行錯誤 29
2.2 JAVASCRIPT的語法:變量聲明 29
2.2.1 變量的數據類型 30
2.2.2 變量聲明 32
2.2.3 變量聲明中的一般性問題 33
2.3 JAVASCRIPT的語法:表達式運算 40
2.3.1 一般表達式運算 42
2.3.2 邏輯運算 42
2.3.3 字符串運算 43
2.3.4 比較運算 44
2.3.5 賦值運算 48
2.3.6 函數調用 49
2.3.7 特殊作用的運算符 50
2.3.8 運算優(yōu)先級 51
2.4 JAVASCRIPT的語法:語句 53
2.4.1 表達式語句 54
2.4.2 分支語句 63
2.4.3 循環(huán)語句 66
2.4.4 流程控制:一般子句 68
2.4.5 流程控制:異常 74
2.5 面向對象編程的語法概要 75
2.5.1 對象直接量聲明與實例創(chuàng)建 76
2.5.2 對象成員列舉、存取和刪除 80
2.5.3 屬性存取與方法調用 84
2.5.4 對象及其成員的檢查 85
2.5.5 可列舉性 87
2.5.6 默認對象的指定 89
2.6 運算符的二義性 89
2.6.1 加號“+”的二義性 90
2.6.2 括號“( )”的二義性 92
2.6.3 冒號“:”與標簽的二義性 93
2.6.4 大括號“{ }”的二義性 94
2.6.5 逗號“,”的二義性 97
2.6.6 方括號“[ ]”的二義性 100
第2部分 語言特性及基本應用 105
第3章 JAVASCRIPT的非函數式語言特性 107
3.1 概述 107
3.1.1 命令式語言與結構化編程 108
3.1.2 結構化的疑難 110
3.1.3 “面向對象語言”是突破嗎? 112
3.1.4 更高層次的抽象:接口 115
3.1.5 再論語言的分類 117
3.1.6 JavaScript的語源 119
3.2 基本語法的結構化含義 121
3.2.1 基本邏輯與代碼分塊 121
3.2.2 模塊化的層次:語法作用域 124
3.2.3 執(zhí)行流程及其變更 129
3.2.4 模塊化的效果:變量作用域 138
3.2.5 語句的副作用 145
3.3 JAVASCRIPT中的原型繼承 148
3.3.1 空對象(null)與空的對象 148
3.3.2 原型繼承的基本性質 149
3.3.3 空的對象是所有對象的基礎 150
3.3.4 構造復制?寫時復制?還是讀遍歷? 151
3.3.5 構造過程:從函數到構造器 153
3.3.6 預定義屬性與方法 154
3.3.7 原型鏈的維護 155
3.3.8 原型繼承的實質 160
3.4 JAVASCRIPT的對象系統 165
3.4.1 封裝 165
3.4.2 多態(tài) 167
3.4.3 事件 169
3.4.4 類抄寫?或原型繼承? 171
3.4.5 JavaScript中的對象(構造器) 176
3.4.6 不能通過繼承得到的效果 178
第4章 JAVASCRIPT的函數式語言特性 181
4.1 概述 181
4.1.1 從代碼風格說起 182
4.1.2 為什么常見的語言不贊同連續(xù)求值 182
4.1.3 函數式語言的淵源 184
4.2 函數式語言中的函數 186
4.2.1 函數是運算元 186
4.2.2 在函數內保存數據 187
4.2.3 函數內的運算對函數外無副作用 188
4.3 從運算式語言到函數式語言 189
4.3.1 JavaScript中的幾種連續(xù)運算 190
4.3.2 運算式語言 194
4.3.3 如何消滅掉語句 198
4.4 函數:對運算式語言的補充和組織 202
4.4.1 函數是必要的補充 202
4.4.2 函數是代碼的組織形式 204
4.4.3 重新認識“函數” 205
4.4.4 JavaScript語言中的函數式編程 208
4.5 JAVASCRIPT中的函數 209
4.5.1 可變參數與值參數傳遞 210
4.5.2 非惰性求值 213
4.5.3 函數是第一型 215
4.5.4 函數是一個值 217
4.5.5 可遍歷的調用棧 218
4.6 閉包 222
4.6.1 什么是閉包 223
4.6.2 什么是函數實例與函數引用 224
4.6.3 (在被調用時,)每個函數實例至少擁有一個閉包 226
4.6.4 函數閉包與調用對象 228
4.6.5 函數實例擁有多個閉包的情況 236
4.6.6 語句或語句塊中的閉包問題 238
4.6.7 閉包中的標識符(變量)特例 240
4.6.8 函數對象的閉包及其效果 242
4.6.9 閉包與可見性 244
第5章 JAVASCRIPT的動態(tài)語言特性 253
5.1 概述 253
5.1.1 動態(tài)數據類型的起源 254
5.1.2 動態(tài)執(zhí)行系統的起源 254
5.1.3 腳本系統的起源 256
5.1.4 腳本只是一種表面的表現形式 257
5.2 動態(tài)執(zhí)行(EVAL) 259
5.2.1 動態(tài)執(zhí)行與閉包 259
5.2.2 動態(tài)執(zhí)行過程中的語句、表達式與值 263
5.2.3 奇特的、甚至是負面的影響 265
5.3 動態(tài)方法調用(CALL與APPLY) 267
5.3.1 動態(tài)方法調用中指定this對象 267
5.3.2 丟失的this引用 269
5.3.3 棧的可見與修改 270
5.3.4 兼容性:低版本中的call()與apply() 272
5.4 重寫 275
5.4.1 原型重寫 275
5.4.2 構造器重寫 276
5.4.3 對象成員的重寫 289
5.4.4 宿主對重寫的限制 292
5.4.5 引擎對重寫的限制 297
5.5 包裝類:面向對象的妥協 301
5.5.1 顯式包裝元數據 302
5.5.2 隱式包裝的過程與檢測方法 303
5.5.3 包裝值類型數據的必要性與問題 305
5.5.4 其他直接量與相應的構造器 306
5.6 關聯數組:對象與數組的動態(tài)特性 309
5.6.1 關聯數組是對象系統的基礎 309
5.6.2 用關聯數組實現的索引數組 310
5.6.3 干凈的對象 313
5.7 類型轉換 316
5.7.1 宿主環(huán)境下的特殊類型系統 317
5.7.2 值運算:類型轉換的基礎 319
5.7.3 隱式轉換 320
5.7.4 值類型之間的轉換 322
5.7.5 從引用到值:深入探究valueOf()方法 327
5.7.6 到字符串類型的顯式轉換 329
第3部分 編程實踐 335
第6章 QOMO框架的核心技術與實現 337
6.1 QOMO框架的技術發(fā)展與基本特性 337
6.1.1 Qomo框架的技術發(fā)展 337
6.1.2 Qomo的體系結構 342
6.1.3 Qomo框架設計的基本原則 343
6.2 基于類繼承的對象系統 345
6.2.1 Qomo類繼承的基本特性 345
6.2.2 Qomo類繼承的語法 347
6.2.3 Qomo類繼承系統的實現 351
6.2.4 Qomo類繼承系統的高級話題 371
6.3 多投事件系統 385
6.3.1 多投事件系統的基本特性與語法 385
6.3.2 多投事件系統的實現 387
6.3.3 多投事件的中斷與返回值 390
6.3.4 多投事件系統的安全性 391
6.4 接口系統 393
6.4.1 基本概念與語法 395
6.4.2 接口實現 398
6.4.3 Qomo接口系統的高級話題 401
6.4.4 接口委托 408
6.4.5 Qomo接口系統的實現 418
6.5 命名空間 426
6.5.1 Qomo命名空間的復雜性 426
6.5.2 命名空間的使用 429
6.5.3 命名空間的實現 433
6.6 AOP 434
6.6.1 基本概念與語法 435
6.6.2 高級切面特性 439
6.6.3 Qomo中切面系統的實現 447
6.7 其他 449
6.7.1 裝載、內聯與導入 449
6.7.2 四種模板技術 453
6.7.3 出錯處理 459
6.7.4 其他功能模塊 460
第7章 一般性的動態(tài)函數式語言技巧 469
7.1 消除代碼的全局變量名占用 469
7.2 一次性的構造器 471
7.3 對象充當識別器 472
7.4 識別NEW運算進行的構造器調用 474
7.5 使用直接量及其包裝類快速調用對象方法 475
7.6 三天前是星期幾? 476
7.7 使用對象的值含義來構造復雜對象 477
7.8 控制字符串替換過程的基本模式 480
7.9 實現二叉樹 481
7.10 將函數封裝為方法 483
7.11 使用WITH語句來替代函數參數傳遞 485
7.12 使用對象閉包來重置重寫 486
7.13 構造函數參數 488
7.14 使用更復雜的表達式來消減IF語句 491
7.15 利用鉤子函數來擴展功能 493
7.16 安全的字符串 495
附錄A:術語表 497
附錄B:主要引擎的特性差異列表 503
附錄C:附圖 505
附錄D:參考書目 509