对于 An Introduction to JavaScript 的个人翻译及一些“添油加醋”
什么是 javascript
js 最初被创造来使 web 动起来,即画龙点睛的点睛之笔,在没有点睛之前的 web 即是 html+css 的静态页面(当然 css 也可以让 html 动起来),但 js 可以让 web 充满更多可能,比如看现在的前端工程就可以得知,从前后端分离后单独的前端项目工程可能就是一个或几个压缩后的 js 文件外加几个静态配置文件,到前端项目打包工具是用 js 编写,再到 js 能够动态改变 DOM 结构以完成页面在浏览器渲染时的千变万化,js 的威力可见一斑。
究其本质,js 只是一种脚本语言,可以写在 html 内容,并可以在页面被加载时自动执行,但是 js 不需要被机器编译,因为它运行在浏览器环境或其他 js 引擎之上,这是它和 java 最大的区别。
而我们有时候听到的 js 编译过程实际上指的是对 js 进行打包压缩,在符合 js 解析规则的前提下最大化减少 js 代码之间的空隙,以使得它在能够实现预期功能的前提下变得尽可能的小,因为它是要在用户访问 html 时下载到用户电脑本地的文件,不同于服务端代码是运行在远离用户电脑的服务器上。
为什么叫 javascript
在其创立之初,其实它叫 livescript,名字也很直观,“动态的脚本”,但时值当时 java 火极一时,想要搭载快车,通过“蹭热度”一并火起来的 js 便改名为 javascript。
但随着其不断地迭代演进,js 逐渐脱离 java 的热度,成为一门独立的语言,基于其自己的规范——ECMAScript(European Computer Manufacturers Association,欧洲计算机制造商组织制定的脚本规范),此规范几乎每年都会有更新和不断完善,js 是其规范的一种实现,所以随着 es 的更新迭代,js 的特性也在不断地扩充。
现在 js 不仅能在浏览器中运行,还能在服务端环境运行,甚至任何设备上,这得益于 js 的运行环境——js 引擎
引擎如何工作
引擎很复杂,但其一些最根本的概念也很好理解
- 引擎读取(解析)脚本
- 然后把脚本转化(“编译”)成机器语言
- 随后机器代码运行起来,非常之快
引擎会在每一个环节执行优化,甚至当脚本运行时侦查并分析运转在脚本内的数据并基于它的能力去对机器代码执行优化,当完成后脚本会运行的非常快。
浏览器内的 js 可以做什么
现在 js 是一种“安全”的语言,它不提供底层对于内存或 CPU 的访问,因为它创建之初被用在不需要它们的浏览器内部
js 的能力强依赖于它所运行的环境,比如 nodejs 支持允许 js 读写任意文件或是处理网络请求等等。
浏览器内的 js 可以做任何和网页计算、人机交互、网页服务等相关的事情
例如它可以:
- 添加新的 html 到已有的页面上,改变已存在的内容,修改页面样式
- 响应用户的动作,比如鼠标点击、鼠标移动、键盘按键
- 将请求通过网络发送给服务器,下载上传文件(所谓的 AJAX 和 COMET 技术)
- 读取写入 cookie,询问访问者问题,展示消息
- 记住客户端数据(本地数据,local storage)
浏览器内的 js 不能做什么
- 网页上的 js 不能任意读写、拷贝硬盘上的文件或执行上面的程序,它不具备直接访问操作系统的方法
现代浏览器允许对文件的操作,但被限于仅仅提供用户做特定的动作,比如拖动文件到浏览器窗口或是通过一个 input 标签选择文件
同时也可以合摄像头、麦克风或其他设备交互,但需要用户明确的授权,所以一个能够运行 js 的网页不会偷偷启动一个网页摄像头去观察着周围的一切并把数据发送给 NSA(美国安全局)
- 不同的页签或窗口彼此之间不互知,有时候它们可能知道,比如用户通过一个窗体使用 js 打开另一个窗体。但即使这种情况,一个页面上的 js 也无法访问另一个页面如果它们来自不同的网站(同一个域名、同一种协议、同一个端口)
这就是同源策略,想要绕开它,两个网站都需要包含一段特殊的 js 代码来处理数据交换
这个限制同样是为了保证用户的安全,一个用户通过http://anysite.com打开的页面必须不能够访问另一个通过http://gmail.com上打开的网页并从那里窃取信息
- js 可以很轻易地通过网络和当前页面从那来的那台服务进行通信,但其从其他网站或其他域下获得数据的能力是受阻的,虽然也可能,但其需要来自远端明确的允许(包含在 HTTP 头内),同样这也是一个安全限制
这些限制如果 js 不是在浏览器内使用是不存在的,比如在服务器端。现代浏览器也允许通过询问拓展许可的插件或拓展
什么使得 js 独一无二
- 和 HTML、CSS 的完全集成
- 简单的事情被简单地处理
- 被所有的主流浏览器支持并默认打开
js 是唯一集合了这三件事的浏览器技术
这铸就了 js 的独一无二,这也是为什么它成为传播最广的创建浏览器接口的工具
“超越”javascript 的语言
js 的语法并不适合每个人的需求,不同的人需要不同的特征
- coffeescript 是 js 一个“语法糖”,它介绍了更简短的语法,允许我们写更加清晰准确的代码,通常 Ruby 开发起来和它很像
- typescript 是一个集中于添加“严格的数据类型检查”以简化开发过程并支持复杂的系统,它由微软开发
- dart 是一种单独的语言并拥有其自己的引擎运行在非浏览器环境(比如移动应用),它最初被谷歌提供用于作为 js 的替代品,但现在浏览器要求其被转化成 js,就像如上的其他语言
还有更多,当然尽管我们使用这其中的一种语言,我们也需要了解 js 以真正地理解我们在做什么
总结
- js 最初被创建用来作为一种仅在浏览器端的语言,但它现在也被用于其他许多环境中
- 今天,js 拥有着独一无二的定位,作为最广泛适配浏览器的语言拥有着对 HTML、CSS 的完全集成
- 还有众多语言可以被转译成 js,并提供着特定的特征。了解一下它们是被推荐的,至少简短地了解下,在征服 js 之后