第一部分 准入训练 3
第1章 进入忍者世界 3
1.1即将探索的JavaScript库 4
1.2理解JavaScript语言 5
1.3跨浏览器注意事项 6
1.4当前最佳实践 9
1.4.1当前最佳实践:测试 9
1.4.2当前最佳实践:性能分析 9
1.5总结 10
第2章 利用测试和调试武装自己 11
2.1调试代码 12
2.1.1日志记录 12
2.1.2断点 14
2.2测试用例生成 15
2.3测试框架 17
2.3.1 QUnit 19
2.3.2 YUI Test 19
2.3.3 JsUnit 19
2.3.4新出的单元测试框架 20
2.4测试套件基础知识 20
2.4.1断言 20
2.4.2 测试组 21
2.4.3异步测试 23
2.5总结 25
第二部分 见习训练 29
第3章 函数是根基 29
3.1函数的独特之处 30
3.1.1 JavaScript的函数式特性为何如此重要 31
3.1.2使用比较器进行排序 35
3.2 函数声明 37
3.3函数调用 44
3.3.1从参数到函数形参 45
3.3.2作为函数进行调用 46
3.3.3作为方法进行调用 47
3.3.4作为构造器进行调用 49
3.3.5使用apply()和call()方法进行调用 52
3.4总结 56
第4章 挥舞函数 57
4.1匿名函数 57
4.2递归 59
4.2.1普通命名函数中的递归 60
4.2.2方法中的递归 61
4.2.3引用的丢失问题 62
4.2.4内联命名函数 64
4.2.5 callee属性 66
4.3将函数视为对象 67
4.3.1函数存储 67
4.3.2自记忆函数 69
4.3.3伪造数组方法 71
4.4可变长度的参数列表 73
4.4.1使用apply()支持可变参数 73
4.4.2 函数重载 74
4.5 函数判断 82
4.6总结 83
第5章 闭包 85
5.1闭包是如何工作的 86
5.2使用闭包 90
5.2.1私有变量 90
5.2.2回调(callback)与计时器(timer ) 92
5.3绑定函数上下文 95
5.4偏应用函数 98
5.5函数重载 101
5.5.1缓存记忆 101
5.5.2函数包装 104
5.6即时函数 106
5.6.1临时作用域和私有变量 107
5.6.2循环 111
5.6.3类库包装 112
5.7总结 113
第6章 原型与面向对象 115
6.1实例化和原型 116
6.1.1对象实例化 116
6.1.2通过构造器判断对象类型 123
6.1.3继承与原型链 124
6.1.4 HTML DOM原型 128
6.2疑难陷阱 130
6.2.1扩展对象 130
6.2.2扩展数字 132
6.2.3子类化原生对象 133
6.2.4实例化问题 134
6.3编写类风格的代码 138
6.3.1检测函数是否可序列化 141
6.3.2子类的实例化 142
6.3.3保留父级方法 142
6.4总结 144
第7章 正则表达式 147
7.1为什么正则表达式很牛 148
7.2正则表达式进阶 149
7.2.1正则表达式解释 149
7.2.2术语与操作符 150
7.3编译正则表达式 154
7.4 捕获匹配的片段 156
7.4.1执行简单的捕获 157
7.4.2用全局表达式进行匹配 158
7.4.3捕获的引用 159
7.4.4没有捕获的分组 160
7.5利用函数进行替换 161
7.6利用正则表达式解决常见问题 164
7.6.1修剪字符串 164
7.6.2匹配换行符 166
7.6.3 Unicode 166
7.6.4转义字符 167
7.7总结 168
第8章 驯服线程和定时器 169
8.1定时器和线程是如何工作的 170
8.1.1设置和清除定时器 170
8.1.2执行线程中的定时器执行 170
8.1.3 timeout与interval之间的区别 172
8.2定时器延迟的最小化及其可靠性 173
8.3处理昂贵的计算过程 176
8.4中央定时器控制 179
8.5异步测试 182
8.6总结 183
第三部分 忍者训练 187
第9章 忍者点金术:运行时代码求值 187
9.1代码求值机制 187
9.1.1用eval()方法进行求值 188
9.1.2用函数构造器进行求值 191
9.1.3用定时器进行求值 191
9.1.4全局作用域内的求值操作 192
9.1.5安全的代码求值 194
9.2函数反编译 195
9.3代码求值实战 198
9.3.1 JSON转化 198
9.3.2导入有命名空间的代码 199
9.3.3 JavaScript压缩和混淆 200
9.3.4动态重写代码 202
9.3.5面向切面的脚本标签 202
9.3.6元语言和领域特定语言 204
9.4总结 207
第10章 with语句 209
10.1 with是怎么回事 210
10.1.1在with作用域内引用属性 210
10.1.2在with作用域内进行赋值 211
10.1.3性能方面的注意事项 213
10.2真实示例 215
10.3导入有命名空间的代码 217
10.4测试 217
10.5使用With进行模板化 218
10.6总结 220
第11章 开发跨浏览器策略 223
11.1选择要支持的浏览器 223
11.2五大开发关注点 225
11.2.1浏览器bug和浏览器差异 226
11.2.2浏览器bug修复 226
11.2.3与外部代码(标记)一起共存 228
11.2.4缺失的功能 232
11.2.5回归 233
11.3实现策略 235
11.3.1安全的跨浏览器修复 235
11.3.2对象检测 236
11.3.3特征仿真 238
11.3.4不可检测的浏览器问题 241
11.4减少假设 243
11.5总结 244
第12章 洞悉特性、属性和样式 245
12.1 DOM特性和DOM属性 246
12.1.1跨浏览器命名 248
12.1.2命名限制 248
12.1.3 XML与HTML之间的差异 249
12.1.4自定义特性的行为 250
12.1.5性能注意事项 250
12.2跨浏览器的attribute问题 254
12.2.1 DOM中的id/name膨胀 254
12.2.2 URL规范化 256
12.2.3 style特性 257
12.2.4 type特性 257
12.2.5 tab index问题 258
12.2.6节点名称 259
12.3令人头疼的样式特性 259
12.3.1样式在何处 260
12.3.2样式属性命名 262
12.3.3float样式属性 263
12.3.4像素值的转换过程 263
12.3.5测量元素的高度和宽度 264
12.3.6通过opacity看透明度 268
12.3.7颜色属性 270
12.4获取计算样式 273
12.5总结 276
第四部分 火影训练 281
第13章 不老事件 281
13.1绑定和解绑事件处理程序 282
13.2 Event对象 286
13.3处理程序的管理 289
13.3.1集中存储相关信息 289
13.3.2管理事件处理程序 292
13.4事件触发 300
13.5冒泡与委托 306
13.5.1将事件委托给祖先元素 307
13.5.2修复浏览器的不足 307
13.6文档就绪事件(document ready) 316
13.7总结 318
第14章 DOM操作 321
14.1向DOM中注入HTML 322
14.1.1将HTML转换成DOM 323
14.1.2将DOM插入到文档中 326
14.1.3脚本执行 328
14.2克隆元素 330
14.3删除元素 331
14.4文本内容 333
14.4.1设置文本 334
14.4.2获取文本 335
14.5总结 336
第15章 CSS选择器引擎 337
15.1 W3C Selectors API 338
15.2利用XPath查找元素 341
15.3纯DOM实现 342
15.3.1对选择器进行解析 345
15.3.2查找元素 346
15.3.3过滤结果集 347
15.3.4递归和合并 347
15.3.5自下而上的选择器引用 348
15.4总结 350