## 出世
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樹會長這樣:

有了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,優勢就很明顯了,前端后端采用同樣的開發語言。