JavaScript語言非常重要,相關(guān)的技術(shù)圖書也很多,但zhi今市面沒有一本對JavaScript語言的 重要部分(函數(shù)、閉包和原型)進(jìn)行深入、全面介紹的圖書,也沒有一本講述跨瀏覽器代碼編寫的圖書。而本書彌補(bǔ)了這一空缺,是由jQuery庫創(chuàng)始人編寫的一本深入剖析JavaScript語言的書。
本書共分4個部分,從不同層次講述了逐步成為JavaScript高手所需的知識。本書從JavaScript語言及 重要的特性談起,由淺入深地探討了函數(shù)、作用域、閉包、生成器函數(shù)、對象、數(shù)組、模塊化、JavaScript與Web頁面的交互以及事件等主題,引導(dǎo)讀者更加深入地了解JavaScript的方方面面,充分展示了JavaScript語言的各種特性。本書結(jié)合ECMAScript 6和7的相關(guān)概念,涵蓋了流行的JavaScript框架所使用的技術(shù)。
本書適合具備一定JavaScript基礎(chǔ)知識的讀者閱讀,也適合從事程序設(shè)計工作并想要深入探索JavaScript語言的讀者閱讀。
JavaScript 正以驚人的速度成為各種應(yīng)用程序的通用語言,包括 Web、桌面、云和移動設(shè)備上的應(yīng)用程序。當(dāng)成為 JavaScript 專業(yè)kaifazhe時,你將擁有可應(yīng)用于所有這些領(lǐng)域的、強(qiáng)大的技能集。
《JavaScript 忍者秘籍(第 2版)》使用實際的案例清晰地詮釋每一個核心概念和技術(shù)。本書向讀者介紹了如何掌握 JavaScript 核心的概念,諸如函數(shù)、閉包、對象、原型和 promise,同時還介紹了 JavaScript API, 包括 DOM、事件和計時器。你將學(xué)會測試、跨瀏覽器開發(fā),所有這些都是JavaScriptkaifazhe應(yīng)該掌握的技能。
本書包含以下內(nèi)容:
* 使用函數(shù)、對象和閉包編寫更高效的代碼;
* 學(xué)會避免JavaScript應(yīng)用陷阱;
* 使用正則表達(dá)式編寫簡潔的文本處理代碼;
* 使用 promise 管理異步代碼;
* 全面修訂以涵蓋 ES6 和 ES7 的概念。
對任何學(xué)科的開發(fā)人員來說,本書都是應(yīng)該閱讀的書籍。它使用強(qiáng)大的技術(shù)來提升你的JavaScript技能。
Becky Huett, Big Shovel Labs
本書針對函數(shù)和閉包的神奇功能提供了全面的洞察,能幫助你有效地使用JavaScript。
Gerd Klevesaat, Siemens
本書是將你的 JavaScript 技能提升到下一個級別的必要資源。
David Starkey, Blum
本書幫你掌握隱秘而又強(qiáng)大的 JavaScript 現(xiàn)代技術(shù)。
Christopher Haupt New Relic Inc.
John Resig 是 jQuery 之父。
Bear Bibeault 是一名 Web kaifazhe,是《JavaScript 忍者秘籍(第 1版)》的合著者,著有《Ajax實戰(zhàn)》《Prototype 和 Scriptaculous 實戰(zhàn)》 《jQuery實戰(zhàn)》。
Josip Maras是一名博士后研究人員,也是一名教師。
目錄
第 1部分 熱身
第 1章 無處不在的
JavaScript 3
1.1 理解JavaScript語言 4
1.1.1 JavaScript是如何發(fā)展
的 5
1.1.2 如今的轉(zhuǎn)換編譯器已經(jīng)能
讓我們體驗未來的
JavaScript 6
1.2 理解瀏覽器 6
1.3 使用當(dāng)前的最佳實踐 7
1.3.1 調(diào)試 8
1.3.2 測試 8
1.3.3 性能分析 9
1.4 提高跨平臺開發(fā)能力 10
1.5 小結(jié) 11
第2章 運(yùn)行時的頁面構(gòu)建
過程 13
2.1 生命周期概覽 14
2.2 頁面構(gòu)建階段 17
2.2.1 HTML解析和DOM
構(gòu)建 18
2.2.2 執(zhí)行JavaScript代碼 19
2.3 事件處理 23
2.3.1 事件處理器概覽 23
2.3.2 注冊事件處理器 25
2.3.3 處理事件 26
2.4 小結(jié) 28
2.5 練習(xí) 29
第2部分 理解函數(shù)
第3章 新手的第一堂函數(shù)
課:定義與參數(shù) 33
3.1 函數(shù)式的不同點(diǎn)到底是什么 34
3.1.1 函數(shù)是第一類對象 35
3.1.2 回調(diào)函數(shù) 36
3.2 函數(shù)作為對象的樂趣 39
3.2.1 存儲函數(shù) 40
3.2.2 自記憶函數(shù) 41
3.3 函數(shù)定義 43
3.3.1 函數(shù)聲明和函數(shù)表達(dá)
式 44
3.3.2 箭頭函數(shù) 48
3.4 函數(shù)的實參和形參 50
3.4.1 剩余參數(shù) 52
3.4.2 默認(rèn)參數(shù) 53
3.5 小結(jié) 56
3.6 練習(xí) 57
第4章 函數(shù)進(jìn)階:理解函數(shù)
調(diào)用 59
4.1 使用隱式函數(shù)參數(shù) 60
4.1.1 arguments參數(shù) 60
4.1.2 this參數(shù):函數(shù)上下文 65
4.2 函數(shù)調(diào)用 65
4.2.1 作為函數(shù)直接被
調(diào)用 66
4.2.2 作為方法被調(diào)用 67
4.2.3 作為構(gòu)造函數(shù)調(diào)用 70
4.2.4 使用apply和call方法
調(diào)用 75
4.3 解決函數(shù)上下文的
問題 81
4.3.1 使用箭頭函數(shù)繞過函數(shù)上下文 81
4.3.2 使用bind方法 85
4.4 小結(jié) 86
4.5 練習(xí) 86
第5章 精通函數(shù):閉包和
作用域 89
5.1 理解閉包 90
5.2 使用閉包 93
5.2.1 封裝私有變量 93
5.2.2 回調(diào)函數(shù) 95
5.3 通過執(zhí)行上下文來跟蹤
代碼 98
5.4 使用詞法環(huán)境跟蹤變量的作用域 101
5.4.1 代碼嵌套 101
5.4.2 代碼嵌套與詞法環(huán)境 102
5.5 理解JavaScript的變量
類型 104
5.5.1 變量可變性 104
5.5.2 定義變量的關(guān)鍵字與詞法環(huán)境 107
5.5.3 在詞法環(huán)境中注冊標(biāo)
識符 111
5.6 研究閉包的工作
原理 114
5.6.1 回顧使用閉包模擬私有變量的代碼 115
5.6.2 私有變量的警告 118
5.6.3 回顧閉包和回調(diào)函數(shù)的
例子 119
5.7 小結(jié) 122
5.8 練習(xí) 122
第6章 未來的函數(shù):生成器和
promise 125
6.1 使用生成器和promise編寫優(yōu)雅的異步代碼 126
6.2 使用生成器函數(shù) 127
6.2.1 通過迭代器對象控制
生成器 129
6.2.2 使用生成器 133
6.2.3 與生成器交互 136
6.2.4 探索生成器內(nèi)部
構(gòu)成 139
6.3 使用promise 145
6.3.1 理解簡單回調(diào)函數(shù)所帶來的問題 146
6.3.2 深入研究promise 149
6.3.3 拒絕promise 151
6.3.4 創(chuàng)建第一個真實promise
案例 153
6.3.5 鏈?zhǔn)秸{(diào)用promise 155
6.3.6 等待多個promise 156
6.3.7 promise競賽 156
6.4 把生成器和promise相
結(jié)合 157
6.5 小結(jié) 161
6.6 練習(xí) 161
第3部分 深入鉆研對象,強(qiáng)化代碼
第7章 面向?qū)ο笈c原型 167
7.1 理解原型 168
7.2 對象構(gòu)造器與原型 171
7.2.1 實例屬性 173
7.2.2 JavaScript動態(tài)特性的副作用 176
7.2.3 通過構(gòu)造函數(shù)實現(xiàn)對象類型 179
7.3 實現(xiàn)繼承 180
7.3.1 重寫constructor屬性的
問題 184
7.3.2 instanceof操作符 187
7.4 在ES6使用JavaScript的class 189
7.4.1 使用關(guān)鍵字class 190
7.4.2 實現(xiàn)繼承 193
7.5 小結(jié) 195
7.6 練習(xí) 196
第8章 控制對象的訪問 199
8.1 使用getter與setter控制屬性訪問 200
8.1.1 定義getter和setter 201
8.1.2 使用getter與setter校驗屬性值 207
8.1.3 使用getter與setter定義如何計算屬性值 208
8.2 使用代理控制訪問 210
8.2.1 使用代理記錄日志 213
8.2.2 使用代理檢測性能 215
8.2.3 使用代理自動填充
屬性 216
8.2.4 使用代理實現(xiàn)負(fù)數(shù)組
索引 218
8.2.5 代理的性能消耗 220
8.3 小結(jié) 221
8.4 練習(xí) 222
第9章 處理集合 225
9.1 數(shù)組 225
9.1.1 創(chuàng)建數(shù)組 226
9.1.2 在數(shù)組兩端添加、刪除
元素 228
9.1.3 在數(shù)組任意位置添加、刪除元素 230
9.1.4 數(shù)組常用操作 232
9.1.5 復(fù)用內(nèi)置的數(shù)組函數(shù) 243
9.2 Map 244
9.2.1 別把對象當(dāng)做Map 245
9.2.2 創(chuàng)建map 248
9.2.3 遍歷map 250
9.3 Set 251
9.3.1 創(chuàng)建Set 253
9.3.2 并集 254
9.3.3 交集 255
9.3.4 差集 256
9.4 小結(jié) 256
9.5 練習(xí) 257
第10章 正則表達(dá)式 259
10.1 為什么需要正則
表達(dá)式 260
10.2 正則表達(dá)式進(jìn)階 261
10.2.1 正則表達(dá)式說明 261
10.2.2 術(shù)語和操作符 262
10.3 編譯正則表達(dá)式 266
10.4 捕獲匹配的片段 268
10.4.1 執(zhí)行簡單捕獲 268
10.4.2 使用全局表達(dá)式進(jìn)行
匹配 270
10.4.3 捕獲的引用 271
10.4.4 未捕獲的分組 272
10.5 利用函數(shù)進(jìn)行替換 273
10.6 使用正則表達(dá)式解決常
見的問題 275
10.6.1 匹配換行 275
10.6.2 匹配Unicode字符 276
10.6.3 匹配轉(zhuǎn)義字符 276
10.7 小結(jié) 277
10.8 練習(xí) 278
第11章 代碼模塊化 281
11.1 在JavaScript ES6之前的
版本中模塊化代碼 282
11.1.1 使用對象、閉包和立即執(zhí)
行函數(shù)實現(xiàn)模塊 282
11.1.2 使用AMD和CommonJS
模塊化JavaScript
應(yīng)用 289
11.2 ES6模塊 291
11.3 小結(jié) 297
11.4 練習(xí) 298
第4部分 洞悉瀏覽器
第12章 DOM操作 303
12.1 向DOM中注入
HTML 304
12.1.1 將HTML字符串轉(zhuǎn)換
成DOM 305
12.1.2 將DOM元素插入到文檔
中 309
12.2 DOM的特性和
屬性 311
12.3 令人頭疼的樣式
特性 313
12.3.1 樣式在何處 314
12.3.2 樣式屬性命名 316
12.3.3 獲取計算后樣式 317
12.3.4 轉(zhuǎn)換像素值 320
12.3.5 測量元素的高度和
寬度 321
12.4 避免布局抖動 326
12.5 小結(jié) 328
12.6 練習(xí) 329
第13章 歷久彌新的事件 331
13.1 深入事件循環(huán) 332
13.1.1 僅含宏任務(wù)的示例 335
13.1.2 同時含有宏任務(wù)和微任務(wù)
的示例 338
13.2 玩轉(zhuǎn)計時器:延遲執(zhí)行和
間隔執(zhí)行 342
13.2.1 在事件循環(huán)中執(zhí)行計
時器 343
13.2.2 處理計算復(fù)雜度高的
任務(wù) 348
13.3 處理事件 351
13.3.1 通過DOM代理事件 352
13.3.2 自定義事件 358
13.4 小結(jié) 361
13.5 練習(xí) 362
第14章 跨瀏覽器開發(fā)
技巧 365
14.1 跨瀏覽器注意事項 366
14.2 五大開發(fā)問題 368
14.2.1 瀏覽器的bug和
差異 369
14.2.2 瀏覽器的bug修復(fù) 369
14.2.3 外部代碼和標(biāo)記 370
14.2.4 回歸 373
14.3 實現(xiàn)策略 374
14.3.1 安全的跨瀏覽器修復(fù)
方法 375
14.3.2 特性檢測和墊片 375
14.3.3 不可測試的瀏覽器
問題 378
14.4 減少假設(shè) 379
14.5 小結(jié) 380
14.6 練習(xí) 381
附錄A ES6附加特性 383
附錄B 測試與調(diào)試的武器 389
附錄C 習(xí)題答案 407