|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +--- |
| 4 | +Title: JavaScript 简介 |
| 5 | + |
| 6 | +URL Source: https://zh.javascript.info/intro |
| 7 | + |
| 8 | +Markdown Content: |
| 9 | +让我们来看看 JavaScript 有什么特别之处,我们可以用它实现什么,以及哪些其他技术可以与其搭配产生奇妙的效果。 |
| 10 | + |
| 11 | +[什么是 JavaScript?](https://zh.javascript.info/intro#shen-me-shi-javascript) |
| 12 | +-------------------------------------------------------------------------- |
| 13 | + |
| 14 | +_JavaScript_ 最初被创建的目的是“使网页更生动”。 |
| 15 | + |
| 16 | +这种编程语言写出来的程序被称为 **脚本**。它们可以被直接写在网页的 HTML 中,在页面加载的时候自动执行。 |
| 17 | + |
| 18 | +脚本被以纯文本的形式提供和执行。它们不需要特殊的准备或编译即可运行。 |
| 19 | + |
| 20 | +这方面,JavaScript 和 [Java](https://en.wikipedia.org/wiki/Java_(programming_language)) 有很大的区别。 |
| 21 | + |
| 22 | +为什么叫 JavaScript? |
| 23 | + |
| 24 | +JavaScript 在刚诞生的时候,它的名字叫 “LiveScript”。但是因为当时 Java 很流行,所以决定将一种新语言定位为 Java 的“弟弟”会有助于它的流行。 |
| 25 | + |
| 26 | +随着 JavaScript 的发展,它已经成为了一门完全独立的语言,并且也拥有了自己的语言规范 [ECMAScript](http://en.wikipedia.org/wiki/ECMAScript)。现在,它和 Java 之间没有任何关系。 |
| 27 | + |
| 28 | +如今,JavaScript 不仅可以在浏览器中执行,也可以在服务端执行,甚至可以在任意搭载了 [JavaScript 引擎](https://en.wikipedia.org/wiki/JavaScript_engine) 的设备中执行。 |
| 29 | + |
| 30 | +浏览器中嵌入了 JavaScript 引擎,有时也称作“JavaScript 虚拟机”。 |
| 31 | + |
| 32 | +不同的引擎有不同的“代号”,例如: |
| 33 | + |
| 34 | +* [V8](https://en.wikipedia.org/wiki/V8_(JavaScript_engine)) —— Chrome、Opera 和 Edge 中的 JavaScript 引擎。 |
| 35 | +* [SpiderMonkey](https://en.wikipedia.org/wiki/SpiderMonkey) —— Firefox 中的 JavaScript 引擎。 |
| 36 | +* ……还有其他一些代号,像 “Chakra” 用于 IE,“JavaScriptCore”、“Nitro” 和 “SquirrelFish” 用于 Safari,等等。 |
| 37 | + |
| 38 | +上面这些术语很容易记住,因为它们经常出现在开发者的文章中。我们也会用到这些术语。例如,如果“V8 支持某个功能”,那么我们可以认为这个功能大概能在 Chrome、Opera 和 Edge 中正常运行。 |
| 39 | + |
| 40 | +引擎是如何工作的? |
| 41 | + |
| 42 | +引擎很复杂,但是基本原理很简单。 |
| 43 | + |
| 44 | +1. 引擎(如果是浏览器,则引擎被嵌入在其中)读取(“解析”)脚本。 |
| 45 | +2. 然后,引擎将脚本转化(“编译”)为机器语言。 |
| 46 | +3. 然后,机器代码快速地执行。 |
| 47 | + |
| 48 | +引擎会对流程中的每个阶段都进行优化。它甚至可以在编译的脚本运行时监视它,分析流经该脚本的数据,并根据获得的信息进一步优化机器代码。 |
| 49 | + |
| 50 | +[浏览器中的 JavaScript 能做什么?](https://zh.javascript.info/intro#liu-lan-qi-zhong-de-javascript-neng-zuo-shen-me) |
| 51 | +---------------------------------------------------------------------------------------------------------- |
| 52 | + |
| 53 | +现代的 JavaScript 是一种“安全的”编程语言。它不提供对内存或 CPU 的底层访问,因为它最初是为浏览器创建的,不需要这些功能。 |
| 54 | + |
| 55 | +JavaScript 的能力很大程度上取决于它运行的环境。例如,[Node.js](https://wikipedia.org/wiki/Node.js) 支持允许 JavaScript 读取/写入任意文件,执行网络请求等的函数。 |
| 56 | + |
| 57 | +浏览器中的 JavaScript 可以做与网页操作、用户交互和 Web 服务器相关的所有事情。 |
| 58 | + |
| 59 | +例如,浏览器中的 JavaScript 可以做下面这些事: |
| 60 | + |
| 61 | +* 在网页中添加新的 HTML,修改网页已有内容和网页的样式。 |
| 62 | +* 响应用户的行为,响应鼠标的点击,指针的移动,按键的按动。 |
| 63 | +* 向远程服务器发送网络请求,下载和上传文件(所谓的 [AJAX](https://en.wikipedia.org/wiki/Ajax_(programming)) 和 [COMET](https://en.wikipedia.org/wiki/Comet_(programming)) 技术)。 |
| 64 | +* 获取或设置 cookie,向访问者提出问题或发送消息。 |
| 65 | +* 记住客户端的数据(“本地存储”)。 |
| 66 | + |
| 67 | +[浏览器中的 JavaScript 不能做什么?](https://zh.javascript.info/intro#liu-lan-qi-zhong-de-javascript-bu-neng-zuo-shen-me) |
| 68 | +-------------------------------------------------------------------------------------------------------------- |
| 69 | + |
| 70 | +为了用户的(信息)安全,在浏览器中的 JavaScript 的能力是受限的。目的是防止恶意网页获取用户私人信息或损害用户数据。 |
| 71 | + |
| 72 | +此类限制的例子包括: |
| 73 | + |
| 74 | +* 网页中的 JavaScript 不能读、写、复制和执行硬盘上的任意文件。它没有直接访问操作系统的功能。 |
| 75 | + |
| 76 | + 现代浏览器允许 JavaScript 做一些文件相关的操作,但是这个操作是受到限制的。仅当用户做出特定的行为,JavaScript 才能操作这个文件。例如,用户把文件“拖放”到浏览器中,或者通过 `<input>` 标签选择了文件。 |
| 77 | + |
| 78 | + 有很多与相机/麦克风和其它设备进行交互的方式,但是这些都需要获得用户的明确许可。因此,启用了 JavaScript 的网页应该不会偷偷地启动网络摄像头观察你,并把你的信息发送到 [美国国家安全局](https://en.wikipedia.org/wiki/National_Security_Agency)。 |
| 79 | + |
| 80 | +* 不同的标签页/窗口之间通常互不了解。有时候,也会有一些联系,例如一个标签页通过 JavaScript 打开的另外一个标签页。但即使在这种情况下,如果两个标签页打开的不是同一个网站(域名、协议或者端口任一不相同的网站),它们都不能相互通信。 |
| 81 | + |
| 82 | + 这就是所谓的“同源策略”。为了解决“同源策略”问题,两个标签页必须 **都** 包含一些处理这个问题的特定的 JavaScript 代码,并均允许数据交换。本教程会讲到这部分相关的知识。 |
| 83 | + |
| 84 | + 这个限制也是为了用户的信息安全。例如,用户打开的 `[http://anysite.com](http://anysite.com/)` 网页必须不能访问 `[http://gmail.com](http://gmail.com/)`(另外一个标签页打开的网页)也不能从那里窃取信息。 |
| 85 | + |
| 86 | +* JavaScript 可以轻松地通过互联网与当前页面所在的服务器进行通信。但是从其他网站/域的服务器中接收数据的能力被削弱了。尽管可以,但是需要来自远程服务器的明确协议(在 HTTP header 中)。这也是为了用户的信息安全。 |
| 87 | + |
| 88 | + |
| 89 | +如果在浏览器环境外(例如在服务器上)使用 JavaScript,则不存在此类限制。现代浏览器还允许安装可能会要求扩展权限的插件/扩展。 |
| 90 | + |
| 91 | +[是什么使得 JavaScript 与众不同?](https://zh.javascript.info/intro#shi-shen-me-shi-de-javascript-yu-zhong-bu-tong) |
| 92 | +--------------------------------------------------------------------------------------------------------- |
| 93 | + |
| 94 | +至少有 **3** 件事值得一提: |
| 95 | + |
| 96 | +* 与 HTML/CSS 完全集成。 |
| 97 | +* 简单的事,简单地完成。 |
| 98 | +* 被所有的主流浏览器支持,并且默认开启。 |
| 99 | + |
| 100 | +JavaScript 是将这三件事结合在一起的唯一的浏览器技术。 |
| 101 | + |
| 102 | +这就是为什么 JavaScript 与众不同。这也是为什么它是用于创建浏览器界面的使用最广泛的工具。 |
| 103 | + |
| 104 | +此外,JavaScript 还可用于创建服务器和移动端应用程序等。 |
| 105 | + |
| 106 | +[JavaScript “上层”语言](https://zh.javascript.info/intro#javascript-shang-ceng-yu-yan) |
| 107 | +---------------------------------------------------------------------------------- |
| 108 | + |
| 109 | +不同的人想要不同的功能。JavaScript 的语法也不能满足所有人的需求。 |
| 110 | + |
| 111 | +这是正常的,因为每个人的项目和需求都不一样。 |
| 112 | + |
| 113 | +因此,最近出现了许多新语言,这些语言在浏览器中执行之前,都会被 **编译**(转化)成 JavaScript。 |
| 114 | + |
| 115 | +现代化的工具使得编译速度非常快且透明,实际上允许开发者使用另一种语言编写代码并会将其“自动转换”为 JavaScript。 |
| 116 | + |
| 117 | +此类语言的示例有: |
| 118 | + |
| 119 | +* [CoffeeScript](https://coffeescript.org/) 是 JavaScript 的一种语法糖。它引入了更加简短的语法,使我们可以编写更清晰简洁的代码。通常,Ruby 开发者喜欢它。 |
| 120 | +* [TypeScript](https://www.typescriptlang.org/) 专注于添加“严格的数据类型”以简化开发,以更好地支持复杂系统的开发。由微软开发。 |
| 121 | +* [Flow](https://flow.org/) 也添加了数据类型,但是以一种不同的方式。由 Facebook 开发。 |
| 122 | +* [Dart](https://www.dartlang.org/) 是一门独立的语言。它拥有自己的引擎,该引擎可以在非浏览器环境中运行(例如手机应用),它也可以被编译成 JavaScript。由 Google 开发。 |
| 123 | +* [Brython](https://brython.info/) 是一个 Python 到 JavaScript 的转译器,让我们可以在不使用 JavaScript 的情况下,以纯 Python 编写应用程序。 |
| 124 | +* [Kotlin](https://kotlinlang.org/docs/reference/js-overview.html) 是一个现代、简洁且安全的编程语言,编写出的应用程序可以在浏览器和 Node 环境中运行。 |
| 125 | + |
| 126 | +这样的语言还有很多。当然,即使我们在使用此类编译语言,我们也需要了解 JavaScript。因为了解 JavaScript 才能让我们真正明白我们在做什么。 |
| 127 | + |
| 128 | +[总结](https://zh.javascript.info/intro#zong-jie) |
| 129 | +----------------------------------------------- |
| 130 | + |
| 131 | +* JavaScript 最开始是专门为浏览器设计的一门语言,但是现在也被用于很多其他的环境。 |
| 132 | +* JavaScript 作为被应用最广泛的浏览器语言,且与 HTML/CSS 完全集成,具有独特的地位。 |
| 133 | +* 有很多其他的语言可以被“编译”成 JavaScript,这些语言还提供了更多的功能。建议最好了解一下这些语言,至少在掌握了 JavaScript 之后大致的了解一下。 |
| 134 | + |
0 commit comments