初识JavaScript
译者:张帆
JavaScript有何特别之处?我们可以用它来实现什么?有哪些其他技术也能发挥很好它的作用?,让我们来一探究竟。
JavaScript是什么?
JavaScript一开始设计出来的初衷是“使网页更加生动”。
JavaScript里的程序称为脚本,脚本可以写在HTML里,并且当页面加载时会自动执行。脚本被提供并且可以作为纯文本来执行。它们不需要一个特别的准备或者编译器来运行,从这方面说,JavaScript与另一个叫Java的编程语言有着巨大的差异。
为什么会被称为JavaScript?
当JavaScript最初被设计出来的时候, 有另一个名字:“LiveScript”。但当时Java十分流行,因此,将JavaScript这一新的语言定位为Java的“小兄弟”将会有助于其发展。
随着JavaScript的不断发展,它已经变成一个完全独立的编程语言,它有自己的 ECMAScript文档,而且和java再无任何关系了。
如今,JavaScript不仅可以在浏览器里运行,而且还可以在服务器端运行,或者说只要有JavaScript引擎,任何设备都可以运行JavaScript。浏览器中都内嵌了一个JavaScript引擎,有时候我们称它为“JavaScript虚拟机”。
不同的引擎会有不同的内核名称,比如:
- V8——在Chrome和Opera中使用
- Gecko——在Firefox浏览器中使用
- 还有一些其他的类似于不同版本IE浏览器使用的“Trident”、“Chakra”,Microsoft Edge使用的“ChakraCore”, safari使用的“Nitro”和“SquirrelFish”等等。
以上内容很好记,因为我们经常在网络开发者的文章中可以看到它们,而且我们也会用到这些,比如:V8支持X功能,那么很可能这个功能能够在Chrome和Opera中应用。
JavaScript引擎是如何工作的?
JavaScript引擎工作细节很复杂,但基础原理很简单。
- 脚本以纯文本的形式被编写和分发(可以通过“javascript minifiers”工具进行压缩和优化)
- JavaScript引擎(如果是浏览器的话,指内嵌引擎)会先解析脚本,然后编译成计算机语言
- 最后运行脚本,而且速度很快
引擎在执行过程的每个阶段都会进行优化,它甚至可以在运行的时候监控脚本,分析经过它的数据,并根据这些知识对机器代码进行优化。这就是代码运行如此之快的原因。
浏览器内嵌的JavaScript能做什么?
如今的JavaScript是一个“安全”的编程语言,它不提供对内存和CPU的低级访问,因为它一开始就是为那些并不需要这些的浏览器设计的。它的能力很大程度上依赖于运行JavaScript的环境。例如,Node.JS支持JavaScript读取/写入任意文件,执行网络请求等等。浏览器的JavaScript能够处理与网页操作,和用户以及服务器后端交互的任何事情。
比如,浏览器的JavaScript可以处理:
- 在页面新建一个HTML,修改已有内容和样式
- 根据用户操作做出反应,如鼠标点击、指针移动以及按键操作
- 向远程服务器发送网络请求,下载和上传文件(就是我们所说的“AJAX”和“COMET”技术)
- 获取并设置cookies,向访问者提问,显示信息
- 记录浏览器端的数据(“本地存储”)
浏览器内嵌的JavaScript还不能做什么?
浏览器中的JavaScript能力因考虑用户的安全原因而受到限制,它目的是防止恶意网页访问私人信息或损害用户的数据。
比如以下受限制的例子:
- 网页中的JavaScript可能没办法读取/写入硬盘上的任意文件,没办法复制、执行程序,它没有直接访问操作系统的功能
现代浏览器允许JavaScript对文件进行操作,但是这种访问是有限的,并且是在用户进行某些操作后才会提供,例如在浏览器窗口“删除”文件或者是通过<input>
标签来选择文件。
有一些方法可以与摄像头/麦克风和其他设备进行交互,但是需要用户明确的许可,所以一个支持JavaScript的网页可能没办法偷偷地调用摄像头观察周围的环境并把信息送给国家安全局。 - 不同的窗口一般来说是互不相干的,有时候会有联系,比如一个窗口用JavaScript打开另一个窗口,但在这种情况下,如果它们来自不同的站点(来自不同的域、协议或端口),就算来自一个页面的JavaScript也可能无法访问其他页面。这被称为“同源策略”。为了解决这个问题,这两个页面必须包含一个处理数据交换的特殊JavaScript代码。
对用户的安全来说,这又是一个限制,一个用户偶尔打开的http://anysite.com 的页面不能打开或访问另一个网址为 http://gmail.com 浏览器窗口,也无法从那里窃取信息。 - JavaScript可以轻松地通过网络与当前页面来自的服务器进行通信,但是它从其他站点/域名接收数据的能力受到了削弱,虽然有这个可能,但需要从远程服务器获取明确的协议(在HTTP头信息显示),但这也是安全限制。
如果JavaScript在浏览器之外比如服务器端运行,这么多限制就不存在了,现代浏览器允许安装扩展插件,这样可能会获取更多的权限。
什么使得JavaScript如此不同?
关于JavaScript,至少有三件很棒的事情:
- 与HTML/CSS完全集成
- 简单的事情简单做
- 被所有主流浏览器支持并默认启用
以上,只存在JavaScript中并没有其他的浏览器技术。
这就是JavaScript如此不同的原因,这也是为什么JavaScript是目前创建浏览器交互界面使用最广泛的工具。
当我们准备学习一项新技术的时候,最好去观望一下它的未来,所以,让我们来看看包括新语言和浏览器能力在内的现代趋势。
JavaScript之外的语言
JavaScript的语法并不符合每个人的需求,不同的人希望有不同的功能细节。这很正常,因为项目和需求对每个人来说都是不同的。所以,最近有很多新的语言如雨后春笋般冒出来,浏览器在运行他们之前会先将它们转化成JavaScript。
现代工具能够使这种转化非常快捷和透明,这实际上允许开发者使用另一种编程语言去编码,然后它会自动进行转化。
这里是一些类似于这种语言的例子:
- CoffeeScript 相对JavaScript来说,像是“语法糖果”,它使用更简短的语法,允许使用更加精确清晰的代码,通常使用Ruby的人会喜欢它。
- TypeScript专注于添加“严格的数据输入”,以简化复杂系统的开发和支持。它是由微软开发的。
- Dart 是一个独立的语言,它有自己的引擎,通常在非浏览器环境中运行(比如移动app),它最初是由谷歌提供的,作为JavaScript的替代品,但是现在,浏览器需要将它转换成JavaScript,就像上面的一样。
还有更多其他的语言,当然,即使我们使用其中一种语言,我们也应该了解JavaScript来真正理解我们在做什么。
总结
- JavaScript最初被创建为一种基于浏览器的语言,但是现在它也被用于许多其他的环境中。
- 如今,JavaScript有一个独特的地位,它是一种被广泛采用的浏览器语言,与HTML / CSS完全集成。
- 有很多语言可以“转换”到JavaScript并提供某些特性。在掌握了JavaScript之后,建议至少简要地看一下它们。