《红宝书》读书笔记
JavaScript高级程序设计(第3版)的个人学习读书笔记
边学边更新ing
C1 JavaScript简介
1.1 JavaScript是什么?
JavaScript是一种专门为与网页交互而设计的脚本语言。浏览器环境下的JavaScript的三大组成部分:ECMAScript、DOM、BOM。
1.2 ECMAScript
- ECMA-262定义的ECMAScript语言与Web浏览器没有依赖关系。ECMAScript这门语言本身不包含输入与输出的定义。
- ECMA-262只是定义了这门语言的基础,它规定了这门语言的以下组成部分:语法、类型、语句、关键字、保留字、操作符、对象。
- ECMAScript就是对实现该标准的各个方面内容的语言的描述。JavaScript只是实现了ECMAScript的其中一种语言。
- ECMAScript有不同版本,浏览器对其也有不同的支持情况。
ECMAScript可以在不同的宿主环境下实现,比如需要注意浏览器环境下与Node.js环境下的区别
1.3 文档对象模型 DOM
- 文档对象模型DOM是针对XML但经过拓展用于HTML的应用程序编程接口。
- DOM把整个页面映射为一个多层节点结构,这些节点包含不同类型的数据。开发人员可以通过DOM创建的这个表示文档的树形图从而获得了控制页面内容和结构的主动权,DOM提供的API对开发中轻松增删改任何节点起到极大帮助。
1.4 浏览器对象模型 BOM
- 开发人员使用BOM控制浏览器显示的页面以外的部分,HTML5中对BOM功能写入了正式规范。
- 从根本上讲,BOM只处理浏览器窗口和框架,但习惯上把所有针对浏览器的JavaScript扩展算作BOM的一部分。
- 没有BOM标准可以遵循,因此每个浏览器都有自己的实现。
C2 在HTML中使用JavaScript
2.1 script元素
使用<script>
元素是向HTML页面中插入JavaScript的主要方法。
2.1.1 <script>的6个属性
- async, charset, defer, language, src, type
- defer和async属性只适用于外部脚本文件。
2.1.2 defer属性
- 在
<script>
元素中设置defer属性,相当于告诉浏览器立刻下载,但延迟执行。 - 使用defer属性可以让脚本在文档完全呈现之后再执行,这个属性的用途是表明脚本在执行时不会影响页面的构造。
- HTML5规范要求脚本按照延迟脚本出现的先后顺序执行,并且会先于DOMContentLoaded事件。但在现实情况下,延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行,因此最好只包含一个延迟脚本。
2.1.3 async属性
- 在
<script>
元素中设置async属性,相当于告诉浏览器立刻下载,并不能保证被标记为async的脚本的执行顺序。 - 异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行。
- 使用async属性可以表示当前脚本不必等待其他脚本,也不必阻塞文档呈现。不能保证异步脚本按照它们在页面中出现的顺序执行。建议异步脚本不要在加载期间修改DOM。
2.1.4 <script>的位置
一般会把全部JavaScript引用放在<body>
元素中页面的内容后面。
2.1.5 <script>中包含代码的加载顺序
只要不存在defer和async属性,浏览器都会按照<script>
元素在页面中出现的先后顺序对它们依次进行解析。
2.2 嵌入代码与外部文件
在HTML中嵌入JavaScript代码和使用外部文件来包含JavaScript代码。使用外部文件是更推荐的做法,优点如下:可维护性、可缓存性、适应未来。
2.3 文档模式
文档模式的概念通过使用文档类型(doctype)切换来实现:混杂模式(quirks mode)和标准模式(standards mode)。混杂模式会让IE的行为与IE5相同,标准模式则让IE的行为更接近标准行为。
2.4 <noscript>元素
为了解决早期浏览器不支持JavaScript时的问题,让页面平稳退化。在不支持JavaScript的浏览器中显示<noscript>
标签中的内容。
C3 基本概念
3.1 语法
- ECMAScript的语法大量借鉴C及其他类C语言(如Java和Perl)。
- 区分大小写
- 标识符
可以按照下列规则组合起来的一个或多个字符:第一个字符必须是一个字母、下划线或一个美元符号,其他字符可以是字母、下划线、美元符号或数字。其中字母可以使用一些扩展的字母字符,但不推荐。
不能把关键字、保留字、true、false和null 用作标识符
- 注释
单行注释 //
块级注释 /* */ - 严格模式
严格模式是为JavaScript定义的一种不同的解析与执行模型。在严格模式下,ECMAScript 3中一切不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。
在整个脚本中启用严格模式,可以在脚本顶部添加 ”use stricrt“;来启用。 - 语句
语句结尾分号的使用,语句结尾的分号不是必需的。本文建议不要省略。
我在实践中,常省略分号。各有其意义,其实保证统一即可。
多条语句的组合,可以使用左花括号 { 开头,右花括号 } 结尾。
3.2 关键字和保留字
- ECMAScript的全部关键字(关键字不能用做标识符)
break, do, instanceof, typeof, case, else, new, var, catch, finally, return, void, continue, for, switch, while, debugger, function, this, with, default, if, throw, delete, in, try - ECMA-262第三版定义的全部保留字(保留字也不能用做标识符,有可能在将来被用作关键字)
abstract, boolean, byte, char, class, const, debugger, double, enum, export, extends, final, float, goto, implements, import, int, interface, long, native, package, private, protected, public, short, static, super, synchronized, throws, transient, volatile - 第5版非严格模式下的保留字缩减为
class, const, enum, export, extends, import, super - 第5版严格模式下,对以下保留字施加了限制
implements, interface, let, package, privtate, protected, public, static, yield
3.3 变量
- ECMAScript的变量是松散类型的。每个变量只是一个用于保存值的占位符,可以用来保存任何类型的数据。
- 定义一个变量:使用 var操作符(var是一个关键字)后跟变量名(即一个标识符)。
e.g.1 var msg。这段代码定义了一个名为msg的变量,该变量可以用来保存任何值,这类没有经过初始化的变量会保存一个特殊的值undefined。
e.g.2 var msg=‘hi’。这段代码定义变量的同时设置了变量的值,直接初始化了变量。 - 定义多个变量:只需要将每个变量(初始化或不初始化均可)用逗号分隔开即可。
- 虽然不建议修改变量所保存值的类型,但这种操作是有效的。
- 使用var操作符定义的变量将成为定义该变量的作用域中的局部变量。通过省略var操作符可以使一个变量成为全局变量,但这并不推荐,不利于维护。
C4 变量、作用域和内存问题
ccontent
C5 引用类型
ccontent
C6 面向对象的程序设计
content
C7 函数表达式
content
C8 BOM
content
C9 客户端检测
content
C10 DOM
content
C11 DOM拓展
content
C12 DOM2和DOM3
content
C13 事件
content
C14 表单脚本
content
C15 使用Canvas绘图
content
C16 HTML5脚本编程
content
C17 错误处理与调试
content
C18 JavaScript与XML
content
C19 E4X
content
C20 JSON
content
C21 Ajax与Comet
content
C22 高级技巧
content
C23 离线应用与客户端存储
content
C24 最佳实践
content
C25 新兴的API
content
附录ABCD
我的附录 章节的学习进展
在这里标注是否精读、是否完成该章节的阅读学习
- 1 略读
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 附录