├── .gitignore
├── cover.jpg
├── img
├── 0-0.jpg
├── 1-0.jpg
├── 2-0.jpg
├── 2-1.png
├── 3-0.jpg
├── 4-0.jpg
├── 4-2.jpg
├── 5-0.jpg
├── 5-1.png
├── 6-0.jpg
├── 7-0.jpg
├── 7-1.png
├── 8-0.jpg
├── 9-0.jpg
├── 10-0.jpg
├── 11-2.png
├── 12-0.jpg
├── 13-0.jpg
├── 14-0.jpg
├── 15-0.jpg
├── 16-0.jpg
├── 16-1.png
├── 17-0.jpg
├── 17-1.png
├── 17-4.png
├── 17-5.png
├── 18-0.jpg
├── 19-0.jpg
├── 19-1.png
├── 20-0.jpg
├── 21-0.jpg
├── 21-1.png
├── qr_alipay.png
├── 16-2.svg
├── 4-3.svg
├── 17-3.svg
├── 14-1.svg
├── 6-1.svg
├── 14-4.svg
├── 11-1.svg
├── 17-2.svg
├── 2-2.svg
├── 14-3.svg
├── 4-1.svg
├── 12-1.svg
├── 19-2.svg
├── 19-3.svg
├── 2-5.svg
├── 2-3.svg
├── 9-3.svg
├── 14-2.svg
├── 2-4.svg
├── 9-2.svg
└── 9-1.svg
├── SUMMARY.md
├── README.md
├── styles
└── ebook.css
├── 13.md
├── 0.md
├── 1.md
├── 7.md
├── 10.md
├── 5.md
├── 12.md
├── 8.md
└── 2.md
/.gitignore:
--------------------------------------------------------------------------------
1 | _book
2 | Thumbs.db
3 |
--------------------------------------------------------------------------------
/cover.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/cover.jpg
--------------------------------------------------------------------------------
/img/0-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/0-0.jpg
--------------------------------------------------------------------------------
/img/1-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/1-0.jpg
--------------------------------------------------------------------------------
/img/2-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/2-0.jpg
--------------------------------------------------------------------------------
/img/2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/2-1.png
--------------------------------------------------------------------------------
/img/3-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/3-0.jpg
--------------------------------------------------------------------------------
/img/4-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/4-0.jpg
--------------------------------------------------------------------------------
/img/4-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/4-2.jpg
--------------------------------------------------------------------------------
/img/5-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/5-0.jpg
--------------------------------------------------------------------------------
/img/5-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/5-1.png
--------------------------------------------------------------------------------
/img/6-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/6-0.jpg
--------------------------------------------------------------------------------
/img/7-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/7-0.jpg
--------------------------------------------------------------------------------
/img/7-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/7-1.png
--------------------------------------------------------------------------------
/img/8-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/8-0.jpg
--------------------------------------------------------------------------------
/img/9-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/9-0.jpg
--------------------------------------------------------------------------------
/img/10-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/10-0.jpg
--------------------------------------------------------------------------------
/img/11-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/11-2.png
--------------------------------------------------------------------------------
/img/12-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/12-0.jpg
--------------------------------------------------------------------------------
/img/13-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/13-0.jpg
--------------------------------------------------------------------------------
/img/14-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/14-0.jpg
--------------------------------------------------------------------------------
/img/15-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/15-0.jpg
--------------------------------------------------------------------------------
/img/16-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/16-0.jpg
--------------------------------------------------------------------------------
/img/16-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/16-1.png
--------------------------------------------------------------------------------
/img/17-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/17-0.jpg
--------------------------------------------------------------------------------
/img/17-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/17-1.png
--------------------------------------------------------------------------------
/img/17-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/17-4.png
--------------------------------------------------------------------------------
/img/17-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/17-5.png
--------------------------------------------------------------------------------
/img/18-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/18-0.jpg
--------------------------------------------------------------------------------
/img/19-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/19-0.jpg
--------------------------------------------------------------------------------
/img/19-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/19-1.png
--------------------------------------------------------------------------------
/img/20-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/20-0.jpg
--------------------------------------------------------------------------------
/img/21-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/21-0.jpg
--------------------------------------------------------------------------------
/img/21-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/21-1.png
--------------------------------------------------------------------------------
/img/qr_alipay.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/HEAD/img/qr_alipay.png
--------------------------------------------------------------------------------
/SUMMARY.md:
--------------------------------------------------------------------------------
1 | + [JavaScript 编程精解 中文第三版](README.md)
2 | + [零、前言](0.md)
3 | + [一、值,类型和运算符](1.md)
4 | + [二、程序结构](2.md)
5 | + [三、函数](3.md)
6 | + [四、数据结构:对象和数组](4.md)
7 | + [五、高阶函数](5.md)
8 | + [六、对象的秘密](6.md)
9 | + [七、项目:机器人](7.md)
10 | + [八、Bug 和错误](8.md)
11 | + [九、正则表达式](9.md)
12 | + [十、模块](10.md)
13 | + [十一、异步编程](11.md)
14 | + [十二、项目:编程语言](12.md)
15 | + [十三、浏览器中的 JavaScript](13.md)
16 | + [十四、文档对象模型](14.md)
17 | + [十五、处理事件](15.md)
18 | + [十六、项目:平台游戏](16.md)
19 | + [十七、在画布上绘图](17.md)
20 | + [十八、HTTP 和表单](18.md)
21 | + [十九、项目:像素艺术编辑器](19.md)
22 | + [二十、Node.js](20.md)
23 | + [二十一、项目:技能分享网站](21.md)
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # JavaScript 编程精解 中文第三版
2 |
3 | 原书:[Eloquent JavaScript 3rd edition](http://eloquentjavascript.net/)
4 |
5 | 译者:[飞龙](https://github.com/wizardforcel)
6 |
7 | 自豪地采用[谷歌翻译](https://translate.google.cn/)
8 |
9 | 部分参考了[《JavaScript 编程精解(第 2 版)》](https://book.douban.com/subject/26707144/)
10 |
11 | + [在线阅读](https://www.gitbook.com/book/wizardforcel/eloquent-js-3e/details)
12 | + [PDF格式](https://www.gitbook.com/download/pdf/book/wizardforcel/eloquent-js-3e)
13 | + [EPUB格式](https://www.gitbook.com/download/epub/book/wizardforcel/eloquent-js-3e)
14 | + [MOBI格式](https://www.gitbook.com/download/mobi/book/wizardforcel/eloquent-js-3e)
15 | + [代码仓库](https://github.com/wizardforcel/eloquent-js-3e-zh)
16 |
17 |
18 | ## 赞助我
19 |
20 | 
21 |
22 | ## 协议
23 |
24 | [CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
25 |
--------------------------------------------------------------------------------
/img/16-2.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/img/4-3.svg:
--------------------------------------------------------------------------------
1 |
2 |
14 |
--------------------------------------------------------------------------------
/img/17-3.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/img/14-1.svg:
--------------------------------------------------------------------------------
1 |
2 |
24 |
--------------------------------------------------------------------------------
/img/6-1.svg:
--------------------------------------------------------------------------------
1 |
2 |
14 |
--------------------------------------------------------------------------------
/img/14-4.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/img/11-1.svg:
--------------------------------------------------------------------------------
1 |
2 |
11 |
--------------------------------------------------------------------------------
/img/17-2.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/img/2-2.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
82 |
--------------------------------------------------------------------------------
/img/14-3.svg:
--------------------------------------------------------------------------------
1 |
2 |
26 |
--------------------------------------------------------------------------------
/img/4-1.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/img/12-1.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/img/19-2.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/img/19-3.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/img/2-5.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
148 |
--------------------------------------------------------------------------------
/img/2-3.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
156 |
--------------------------------------------------------------------------------
/img/9-3.svg:
--------------------------------------------------------------------------------
1 |
2 |
176 |
--------------------------------------------------------------------------------
/img/14-2.svg:
--------------------------------------------------------------------------------
1 |
2 |
37 |
--------------------------------------------------------------------------------
/styles/ebook.css:
--------------------------------------------------------------------------------
1 | /* GitHub stylesheet for MarkdownPad (http://markdownpad.com) */
2 | /* Author: Nicolas Hery - http://nicolashery.com */
3 | /* Version: b13fe65ca28d2e568c6ed5d7f06581183df8f2ff */
4 | /* Source: https://github.com/nicolahery/markdownpad-github */
5 |
6 | /* RESET
7 | =============================================================================*/
8 |
9 | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
10 | margin: 0;
11 | padding: 0;
12 | border: 0;
13 | }
14 |
15 | /* BODY
16 | =============================================================================*/
17 |
18 | body {
19 | font-family: Helvetica, arial, freesans, clean, sans-serif;
20 | font-size: 14px;
21 | line-height: 1.6;
22 | color: #333;
23 | background-color: #fff;
24 | padding: 20px;
25 | max-width: 960px;
26 | margin: 0 auto;
27 | }
28 |
29 | body>*:first-child {
30 | margin-top: 0 !important;
31 | }
32 |
33 | body>*:last-child {
34 | margin-bottom: 0 !important;
35 | }
36 |
37 | /* BLOCKS
38 | =============================================================================*/
39 |
40 | p, blockquote, ul, ol, dl, table, pre {
41 | margin: 15px 0;
42 | }
43 |
44 | /* HEADERS
45 | =============================================================================*/
46 |
47 | h1, h2, h3, h4, h5, h6 {
48 | margin: 20px 0 10px;
49 | padding: 0;
50 | font-weight: bold;
51 | -webkit-font-smoothing: antialiased;
52 | }
53 |
54 | h1 tt, h1 code, h2 tt, h2 code, h3 tt, h3 code, h4 tt, h4 code, h5 tt, h5 code, h6 tt, h6 code {
55 | font-size: inherit;
56 | }
57 |
58 | h1 {
59 | font-size: 24px;
60 | border-bottom: 1px solid #ccc;
61 | color: #000;
62 | }
63 |
64 | h2 {
65 | font-size: 18px;
66 | color: #000;
67 | }
68 |
69 | h3 {
70 | font-size: 14px;
71 | }
72 |
73 | h4 {
74 | font-size: 14px;
75 | }
76 |
77 | h5 {
78 | font-size: 14px;
79 | }
80 |
81 | h6 {
82 | color: #777;
83 | font-size: 14px;
84 | }
85 |
86 | body>h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h4:first-child, body>h5:first-child, body>h6:first-child {
87 | margin-top: 0;
88 | padding-top: 0;
89 | }
90 |
91 | a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
92 | margin-top: 0;
93 | padding-top: 0;
94 | }
95 |
96 | h1+p, h2+p, h3+p, h4+p, h5+p, h6+p {
97 | margin-top: 10px;
98 | }
99 |
100 | /* LINKS
101 | =============================================================================*/
102 |
103 | a {
104 | color: #4183C4;
105 | text-decoration: none;
106 | }
107 |
108 | a:hover {
109 | text-decoration: underline;
110 | }
111 |
112 | /* LISTS
113 | =============================================================================*/
114 |
115 | ul, ol {
116 | padding-left: 30px;
117 | }
118 |
119 | ul li > :first-child,
120 | ol li > :first-child,
121 | ul li ul:first-of-type,
122 | ol li ol:first-of-type,
123 | ul li ol:first-of-type,
124 | ol li ul:first-of-type {
125 | margin-top: 0px;
126 | }
127 |
128 | ul ul, ul ol, ol ol, ol ul {
129 | margin-bottom: 0;
130 | }
131 |
132 | dl {
133 | padding: 0;
134 | }
135 |
136 | dl dt {
137 | font-size: 14px;
138 | font-weight: bold;
139 | font-style: italic;
140 | padding: 0;
141 | margin: 15px 0 5px;
142 | }
143 |
144 | dl dt:first-child {
145 | padding: 0;
146 | }
147 |
148 | dl dt>:first-child {
149 | margin-top: 0px;
150 | }
151 |
152 | dl dt>:last-child {
153 | margin-bottom: 0px;
154 | }
155 |
156 | dl dd {
157 | margin: 0 0 15px;
158 | padding: 0 15px;
159 | }
160 |
161 | dl dd>:first-child {
162 | margin-top: 0px;
163 | }
164 |
165 | dl dd>:last-child {
166 | margin-bottom: 0px;
167 | }
168 |
169 | /* CODE
170 | =============================================================================*/
171 |
172 | pre, code, tt {
173 | font-size: 12px;
174 | font-family: Consolas, "Liberation Mono", Courier, monospace;
175 | }
176 |
177 | code, tt {
178 | margin: 0 0px;
179 | padding: 0px 0px;
180 | white-space: nowrap;
181 | border: 1px solid #eaeaea;
182 | background-color: #f8f8f8;
183 | border-radius: 3px;
184 | }
185 |
186 | pre>code {
187 | margin: 0;
188 | padding: 0;
189 | white-space: pre;
190 | border: none;
191 | background: transparent;
192 | }
193 |
194 | pre {
195 | background-color: #f8f8f8;
196 | border: 1px solid #ccc;
197 | font-size: 13px;
198 | line-height: 19px;
199 | overflow: auto;
200 | padding: 6px 10px;
201 | border-radius: 3px;
202 | }
203 |
204 | pre code, pre tt {
205 | background-color: transparent;
206 | border: none;
207 | }
208 |
209 | kbd {
210 | -moz-border-bottom-colors: none;
211 | -moz-border-left-colors: none;
212 | -moz-border-right-colors: none;
213 | -moz-border-top-colors: none;
214 | background-color: #DDDDDD;
215 | background-image: linear-gradient(#F1F1F1, #DDDDDD);
216 | background-repeat: repeat-x;
217 | border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD;
218 | border-image: none;
219 | border-radius: 2px 2px 2px 2px;
220 | border-style: solid;
221 | border-width: 1px;
222 | font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
223 | line-height: 10px;
224 | padding: 1px 4px;
225 | }
226 |
227 | /* QUOTES
228 | =============================================================================*/
229 |
230 | blockquote {
231 | border-left: 4px solid #DDD;
232 | padding: 0 15px;
233 | color: #777;
234 | }
235 |
236 | blockquote>:first-child {
237 | margin-top: 0px;
238 | }
239 |
240 | blockquote>:last-child {
241 | margin-bottom: 0px;
242 | }
243 |
244 | /* HORIZONTAL RULES
245 | =============================================================================*/
246 |
247 | hr {
248 | clear: both;
249 | margin: 15px 0;
250 | height: 0px;
251 | overflow: hidden;
252 | border: none;
253 | background: transparent;
254 | border-bottom: 4px solid #ddd;
255 | padding: 0;
256 | }
257 |
258 | /* TABLES
259 | =============================================================================*/
260 |
261 | table th {
262 | font-weight: bold;
263 | }
264 |
265 | table th, table td {
266 | border: 1px solid #ccc;
267 | padding: 6px 13px;
268 | }
269 |
270 | table tr {
271 | border-top: 1px solid #ccc;
272 | background-color: #fff;
273 | }
274 |
275 | table tr:nth-child(2n) {
276 | background-color: #f8f8f8;
277 | }
278 |
279 | /* IMAGES
280 | =============================================================================*/
281 |
282 | img {
283 | max-width: 100%
284 | }
--------------------------------------------------------------------------------
/img/2-4.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
176 |
--------------------------------------------------------------------------------
/img/9-2.svg:
--------------------------------------------------------------------------------
1 |
2 |
73 |
--------------------------------------------------------------------------------
/13.md:
--------------------------------------------------------------------------------
1 | ## 十三、浏览器中的 JavaScript
2 |
3 | > 原文:[JavaScript and the Browser](https://eloquentjavascript.net/13_browser.html)
4 | >
5 | > 译者:[飞龙](https://github.com/wizardforcel)
6 | >
7 | > 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
8 | >
9 | > 自豪地采用[谷歌翻译](https://translate.google.cn/)
10 | >
11 | > 部分参考了[《JavaScript 编程精解(第 2 版)》](https://book.douban.com/subject/26707144/)
12 |
13 | > Web 背后的梦想是公共信息空间,其中我们通过共享信息进行交流。 其普遍性至关重要:超文本链接可指向任何东西,无论是个人的,本地的还是全球的,无论是草稿还是高度润色的。
14 | >
15 | > Douglas Crockford,《JavaScript 编程语言》(视频讲座)
16 |
17 | 
18 |
19 | 本书接下来的章节将会介绍 Web 浏览器。可以说,没有浏览器,就没有 JavaScript。就算有,估计也不会有多少人去关心这门编程语言。
20 |
21 | Web 技术自出现伊始,其演变方式和技术上就是以分散的方式发展的。许多浏览器厂商专门为其开发新的功能,有时这些新功能被大众采纳,有时这些功能被其他功能所代替,最终形成了一套标准。
22 |
23 | 这种发展模式是把双刃剑。一方面,不会有一个集中式的组织来管理技术的演进,取而代之的是一个包含多方利益集团的松散协作架构(偶尔会出现对立)。另一方面,互联网这种无计划的发展方式所开发出来的系统,其内部很难实现一致性。事实上,它的一些部分令人疑惑,并且毫无设计。
24 |
25 | ## 网络和 Internet
26 |
27 | 计算机网络出现在 20 世纪 50 年代。如果在两台或多台计算机之间铺设电缆,那么你可以通过这些电缆互相收发数据,并实现一些神奇的功能。
28 |
29 | 如果通过连接同一个建筑中的两台机器就可以实现一些神奇的功能,那么如果可以连接全世界的机器,就可以完成更伟大的工作了。20 世纪 80 年代,人们开发了相关技术来实现这个愿景,我们将其产生的网络称为 Internet。而 Internet 的表现名副其实。
30 |
31 | 计算机可以使用这种网络向其他计算机发送位数据。为了在传输位数据的基础上,实现计算机之间的有效通信,网络两端的机器必须知道这些位所表达的实际含义。对于给定的位序列,其含义完全取决于位序列描述的信息类型与使用的编码机制。
32 |
33 | 网络协议描述了一种网络通信方式。网络协议非常多,其中包括邮件发送、邮件收取和邮件共享,甚至连病毒软件感染控制计算机都有相应的协议。
34 |
35 | 例如,HTTP(超文本传输协议,Hypertext Transfer Protocol)是用于检索命名资源(信息块,如网页或图片)的协议。 它指定发出请求的一方应该以这样的一行开始,命名资源和它正在尝试使用的协议的版本。
36 |
37 | ```
38 | GET /index.html HTTP/1.1
39 | ```
40 |
41 | 有很多规则,关于请求者在请求中包含更多信息的方式,以及另一方返回资源并打包其内容的方式。 我们将在第 18 章中更详细地观察 HTTP。
42 |
43 | 大多数协议都建立在其他协议之上。 HTTP 将网络视为一种流式设备,您可以将位放入这些设备,并使其按正确的顺序到达正确的目的地。 我们在第 11 章]中看到,确保这些事情已经是一个相当困难的问题。
44 |
45 |
46 | TCP(传输控制协议,Transmission Control Protocol)就可以帮助我们解决该问题。所有连接到互联网的设备都会使用到这种协议,而多数互联网通信都构建在这种协议之上。
47 |
48 | TCP 连接的工作方式是一台电脑必须等待或者监听,而另一台电脑则开始与之通信。一台机器为了同时监听不同类型的通信信息,会为每个监听器分配一个与之关联的数字(我们称之为端口)。大多数协议都指定了默认使用的端口。例如,当我们向使用 SMTP 协议发送一封邮件时,我们需要通过一台机器来发送邮件,而发送邮件的机器需要监听端口 25。
49 |
50 | 随后另一台机器连接到使用了正确端口号的目标机器上。如果可以连接到目标机器,而且目标机器在监听对应端口,则说明连接创建成功。负责监听的计算机名为服务器,而连接服务器的计算机名为客户端。
51 |
52 | 我们可以将该连接看成双向管道,位可以在其中流动,也就是说两端的机器都可以向连接中写入数据。当成功传输完这些位数据后,双方都可以读取另一端传来的数据。TCP 是一个非常便利的模型。我们可以说TCP就是一种网络的抽象。
53 |
54 | ## Web
55 |
56 | 万维网(World Wide Web,不要将其与 Internet 混淆)是包含一系列协议和格式的集合,允许我们通过浏览器访问网页。词组中的 Web 指的是这些页面可以轻松地链接其他网页,因此最后可以连接成一张巨大的网,用户可以在网络中浏览。
57 |
58 | 你只需将一台计算机连接到 Internet 并使用 HTTP 监听 80 端口,就可以成为 Web 的一部分。其他计算机可以通过网络,并使用 HTTP 协议获取其他计算机上的文件。
59 |
60 | 网络中的每个文件都能通过 URL(统一资源定位符,Universal Resource Locator)访问,如下所示:
61 |
62 | ```
63 | http://eloquentjavascript.net/13_browser.html
64 | | | | |
65 | protocol server path
66 | ```
67 | 该地址的第一部分告诉我们 URL 使用的是 HTTP 协议(加密的 HTTP 连接则使用`https://`来表示)。第二部分指的是获取文件的服务器地址。第三部分是我们想要获取的具体文件(或资源)的路径。
68 |
69 | 连接到互联网的机器获得一个 IP 地址,该地址是一个数字,可用于将消息发送到该机器的,类似于`"149.210.142.219"`或`"2001:4860:4860::8888"`。 但是或多或少的随机数字列表很难记住,而且输入起来很笨拙,所以你可以为一个特定的地址或一组地址注册一个域名。 我注册了`eloquentjavascript.net`,来指向我控制的机器的 IP 地址,因此可以使用该域名来提供网页。
70 |
71 | 如果你在浏览器地址栏中输入上面提到的 URL,浏览器会尝试获取并显示该 URL 对应的文档。首先,你的浏览器需要找出域名`eloquentjavascript.net`指向的地址。然后使用 HTTP 协议,连接到该地址处的服务器,并请求`/13_browser.html`这个资源。如果一切顺利,服务器会发回一个文档,然后您的浏览器将显示在屏幕上。
72 |
73 | ## HTML
74 |
75 | HTML,即超文本标记语言(Hypertext Markup Language),是在网页中得到广泛使用的文档格式。HTML 文档不仅包含文本,还包含了标签,用于说明文本结构,描述了诸如链接、段落、标题之类的元素。
76 |
77 | 一个简短的 HTML 文档如下所示:
78 |
79 | ```html
80 |
81 |
82 |
83 |
84 | My home page
85 |
86 |
87 | My home page
88 | Hello, I am Marijn and this is my home page.
89 | I also wrote a book! Read it
90 | here.
91 |
92 |
93 | ```
94 |
95 | 标签包裹在尖括号之间(`<`和`>`,小于和大于号),提供关于文档结构的信息。其他文本则是纯文本。
96 |
97 | 文档以``开头,告诉浏览器将页面解释为现代 HTML,以别于过去使用的各种方言。
98 |
99 | HTML 文档有头部(head)和主体(body)。头部包含了文档信息,而主体则包含文档自身。在本例中,头部将文档标题声明为`"My home page"`,并使用 UTF-8 编码,它是将 Unicode 文本编码为二进制的方式。文档的主体包含标题(``,表示一级标题,``到``可以产生不同等级的子标题)和两个段落(`
`)。
100 |
101 | 标签有几种形式。一个元素,比如主体、段落或链接以一个起始标签(比如`
`)开始,并以一个闭合标签(比如`
`)结束。一些起始标签,比如一个链接(``),会包含一些额外信息,其形式是`name="value"`这种键值对,我们称之为属性。在本例中,使用属性`href="http://eloquentjavascript.net"`指定链接的目标,其中`href`表示“超文本链接(Hypertext Reference)”。
102 |
103 | 某些类型的标签不会包含任何元素,这种标签不需要闭合。元数据标签``就是一个例子。
104 |
105 | > 译者注:最好还是这样闭合它们:``。
106 |
107 | 尽管 HTML 中尖括号有特殊含义,但为了在文档的文本中包含这些符号,可以引入另外一种形式的特殊标记方法。普通文本中的起始尖括号写成`<`(less than),而闭合尖括号写成`>`(greater than)。在 HTML 中,我们将一个`&`字符后跟着一个单词和分号(`;`)这种写法称为一个实体,浏览器会使用实体编码对应的字符替换它们。
108 |
109 | 与之类似的是 JavaScript 字符串中反斜杠的使用。由于 HTML 中的实体机制赋予了`&`特殊含义,因此我们需要使用`&`来表示一个`&`字符。在属性的值(包在双引号中)中使用`"`可以插入实际的引号字符。
110 |
111 | HTML 的解析过程容错性非常强。当应有的标签丢失时,浏览器会重新构建这些标签。标签的重新构建已经标准化,你可以认为所有现代浏览器的行为都是一致的。
112 |
113 | 下面的文件与之前版本显示效果相同:
114 |
115 | ```html
116 |
117 |
118 |
119 | My home page
120 |
121 | My home page
122 | Hello, I am Marijn and this is my home page.
123 |
I also wrote a book! Read it
124 | here.
125 | ```
126 |
127 | ``、`
`和``标签可以完全丢弃。浏览器知道``和``属于头部,而``属于主体。此外,我再也不用明确关闭某个段落,因为新段落开始或文档结束时,浏览器会隐式关闭段落标签。目标链接两边的引号也可以丢弃。
128 |
129 | 本书的示例通常都会省略``、``和``标签,以保持源代码简短,避免太过杂乱。但我会明确关闭所有标签并在属性两旁包含引号。
130 |
131 | 本书也会经常忽略`doctype`和`charset`声明。这并不是鼓励大家省略它们。当你忘记它们时,浏览器往往会做出荒谬的事情。 您应该认为`doctype`和`charset`元数据隐式出现在示例中,即使它们没有实际显示在文本中。
132 |
133 | ## HTML 和 JavaScript
134 |
135 | 对于本书来说,最重要的一个 HTML 标签是`
140 | ```
141 |
142 | 当浏览器在读取 HTML 时,一旦遇到`
149 | ```
150 |
151 | 这里包含的文件`code/hello.js`是和上文中相同的一段程序,`alert("hello")`。当一个页面将其他 URL 引用为自身的一部分时(比如图像文件或脚本),网页浏览器将会立即获取这些资源并将其包含在页面中。
152 |
153 | 即使`script`标签引用了一个文本文件,且并未包含任何代码,你也必须使用``来闭合标签。如果你忘记了这点,浏览器会将剩余的页面会作为脚本的一部分进行解析。
154 |
155 | 你可以在浏览器中加载ES模块(参见第 10 章),向脚本标签提供`type ="module"`属性。 这些模块可以依赖于其他模块,通过将相对于自己的 URL 用作`import`声明中的模块名称。
156 |
157 |
158 | 某些属性也可以包含 JavaScript 程序。下面展示的`