## 出世
JavaScript出生在Netscape浏览器中,当时的网页主要是丑陋的静态文本以及简单的图片
那个时候,人们还在用Modem上网,网速只有28.8kbps
那个时候的人们在上网的时候有可能遇到下面这种问题,注册用户的时候填了一个表单,28s以后,服务器告诉他忘了选择性别。
这种问题完全可以由浏览器来判定,而不需要把数据提交到千里之外的服务器才能发现。
所以开发一种脚本在浏览器中运行势在必行。
不过JavaScript的发明者Brendan Eich没有想到JavaScript会这么火,他只使用了10天时间就设计出来了。所以在一些细节上处理得不够严谨
而且JavaScript本来叫LiveScript,但是为了向Java示好,LiveScript竟然被修改成了JavaScript,实际上这两种语言没有任何关系。
## 成长
JavaScript无法读取文件,因为他生活在浏览器
使用JavaScript写的程序只能嵌入在HTML网页里面。能做的就是操作HTML的DOM和浏览器
什么是DOM呢?
浏览器从服务器取到HTML以后,会展示成页面,但是他的内部会把HTML组织成一个树。这个树就是DOM
例如:
```
<html>
<head>
<title>Sample Page</title>
</head>
<body>
<p>hello world!</p>
</body>
</html>
```
DOM树会长这样:
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180816111626.png?picgo)
有了DOM树,JavaScript就可以定位到DOM树中任意一个节点,然后对这个节点进行操作,比如隐藏节点、显示节点、改变颜色、获得文本值、改变文本的值,添加点击事件等
而且这些操作可以立刻显示出效果来,完全不用刷新网页。
这些操作都是在内部完成的,HTML源码不会改变。所以当你打开HTML源码的时候,发现源码与浏览器看到的效果不一致。
所以JavaScript可以做表单验证,还功能控制浏览器比如打开窗口,获得浏览器的名称或者版本
## 第一桶金
此时的JavaScript存在一个缺点:JavaScript只能在浏览器中运行,没有办法像Java那样访问网络,也就没有办法调用服务器端的接口来获取数据。
用户只能通过GET或者POST向服务器发送请求,这个时候服务器返回的是整个页面,而不是页面中的一个片段,也就是整个页面需要刷新一下,哪怕只是改变一个字
1998年IE5引入了一个新功能XMLHttpRequest,这个功能允许JavaScript向服务器发出接口调用
比如说拿用户名和密码,通过XMLHttpRequest去访问服务器端的登陆接口URL,这个过程需要耗费比较长的时间,在这段时间里面,浏览器不需要等待反回结果。
而与由JavaScript等待数据传输返回,然后调用回传函数,把DOM树的某个节点更新一下,例如让包含用户名和密码的登录框消失,再加一个提示消息:登录成功
如果服务器处理和网络速度都够快的话,用户会发现,没有刷新整个页面就已经登录了
这种方式可以使得网页局部刷新, 让用户浏览网页的体验极佳, 尤其是 Google 地图, Gmail 等应用让互联网应用火了起来。
## JSON
后来有人把这种处理方式称为AJAX(“Asynchronous Javascript And XML”(异步 JavaScript 和 XML))
现在的问题是服务器返回了下面这端XML
```
<book>
<isbn>978-7-229-03093-3</isbn>
<name> 三体 </name>
<author> 刘慈欣 </author>
<introduction> 中国最牛的科幻书 </introduction>
<price>38.00</price>
</book>
```
真正的数据很少,标签却很多。
JavaScript的语法中有个叫对象的东西,外层是一个花括号,内部是键值对,属性由逗号隔开。
```
var book = {
"isbn": "978-7-229-03093-3",
"name": "三体",
"author": "刘慈欣",
"introduction": "中国最牛的科幻书",
"price": "38.00"
}
```
这种结构可以表达上面XML的内容
而且还支持数组
```
var books = [
{
"isbn": "978-7-229-03093-3",
"name": "三体",
"author": "刘慈欣",
"introduction": "中国最牛的科幻书",
"price": "38.00"
},
{
"isbn": "978-7-229-03094-1",
"name": "我是一个线程",
"author": "刘欣",
"introduction": "一个线程的自述",
"price": "0.0"
}
]
```
数据和对象都支持嵌套
更重要的是,不需要使用XML解析器去解析,可以直接拿来用
```
books[0].name --> 返回 “三体”
books[1].introduction --> 返回 “一个线程的自述”
```
## 巅峰
HTML 负责结构, CSS 负责展示, 而我(加上 AJAX, JSON) 负责逻辑。
于是前端编程三剑客形成了。
ExtJS, prototype, JQuery 这些框架把前端编程推向另外一个高峰。
甚至出现了 AngularJS 这样的奇葩,实现了 SPA(单一页面应用程序), 实在是难于想象。
现在JavaScript可以在浏览器端实现MVC,只需要在服务器端通过接口给JavaScript提供数据就行。
那么JavaScript可以移植到服务器端吗?
我们知道服务器端好处在于资源无限,缺点在于多线程编程,很多东西都需要加锁,基本上一个请求就是一个线程来处理,遇到数据库操作,线程必须等待。
那能修改成异步的吗?至少对Java来说比较难,因为已经积重难返了。
那么怎么把JavaScript放到服务器端呢?
首先得把浏览器端运行环境移到服务器端,而且执行速度还得足够快。
原来的引擎一直不合格,知道Chrome V8出现才解决问题。
其次还得绕开线程遇到IO、数据库、网络这种耗时操作还在等待的问题,必须搞成异步处理
2009年Ryan Dahl把JavaScript放到了服务器端,这就是Node.js
这样前端后端都可以使用JavaScript,优势就很明显了,前端后端采用同样的开发语言。