JavaScript 簡(jiǎn)介
我們一起來聊一下 JavaScript,用它能做什么,它有哪些特性,以及一些跟它配合使用的技術(shù)。
什么是 JavaScript?
JavaScript 最初的目的是為了“賦予網(wǎng)頁生命”。
這種編程語言我們稱之為腳本。它們可以寫在 HTML 中,在頁面加載的時(shí)候會(huì)自動(dòng)執(zhí)行。
腳本作為純文本存在和執(zhí)行。它們不需要特殊的準(zhǔn)備或編譯即可運(yùn)行。
這方面,JavaScript 和 Java <http://en.wikipedia.org/wiki/Java> 有很大的區(qū)別。
為什么叫 JavaScript?
JavaScript 在剛誕生的時(shí)候,它的名字叫 “LiveScript”。但是因?yàn)楫?dāng)時(shí) Java 很流行,所以決定將一種新語言定位為 Java
的“弟弟”會(huì)有助于它的流行。
隨著 JavaScript 的發(fā)展,它已經(jīng)變成了一門獨(dú)立的語言,同時(shí)也有了自己的語言規(guī)范 ECMAScript
<http://en.wikipedia.org/wiki/ECMAScript>?,F(xiàn)在,它和 Java 之間沒有任何關(guān)系。
現(xiàn)在,JavaScript 不僅僅是在瀏覽器內(nèi)執(zhí)行,也可以在服務(wù)端執(zhí)行,甚至還能在任意搭載了 JavaScript 引擎
<https://en.wikipedia.org/wiki/JavaScript_engine> 的設(shè)備中都可以執(zhí)行。
瀏覽器中嵌入了 JavaScript 引擎,有時(shí)也稱作 JavaScript 虛擬機(jī)。
不同的引擎有不同的“代號(hào)”,例如:
* V8 <https://en.wikipedia.org/wiki/V8_(JavaScript_engine)> —— Chrome 和 Opera
中的 JavaScript 引擎。
* SpiderMonkey <https://en.wikipedia.org/wiki/SpiderMonkey> —— Firefox 中的
JavaScript 引擎。
* ……還有其他一些代號(hào),像“Trident”,“Chakra”用于不同版本的 IE,“ChakraCore”用于 Microsoft
Edge,“Nitro”和“SquirrelFish”用于 Safari,等等。
上面這些名稱很容易記憶,因?yàn)榻?jīng)常出現(xiàn)在網(wǎng)上開發(fā)者的文章中。我們也會(huì)用到這些名稱。例如:某個(gè)新的功能,如果“JavaScript 引擎 V8
是支持的”,那么我們可以認(rèn)為這個(gè)功能大概能在 Chrome 和 Opera 中正常運(yùn)行。
引擎是如何工作的?
引擎很復(fù)雜,但是基本原理很簡(jiǎn)單。
* 引擎(通常嵌入在瀏覽器中)讀?。ā敖馕觥保┠_本。
* 然后將腳本轉(zhuǎn)化(“編譯”)為機(jī)器語言。
* 然后這機(jī)器語言代碼快速地運(yùn)行。
引擎會(huì)對(duì)流程中的每個(gè)階段都進(jìn)行優(yōu)化。它甚至可以在運(yùn)行時(shí)監(jiān)視編譯的腳本,分析數(shù)據(jù)流并根據(jù)這些對(duì)機(jī)器代碼應(yīng)用優(yōu)化。最后,腳本會(huì)執(zhí)行地非??臁?br>
瀏覽器中的 JavaScript 能做什么?
現(xiàn)代的 JavaScript 是一種“安全”語言。它不提供對(duì)內(nèi)存或 CPU 的底層訪問,因?yàn)樗畛跏菫闉g覽器創(chuàng)建的,不需要這些功能。
JavaScript 的能力很大程度上依賴于它執(zhí)行的環(huán)境。例如:Node.js <https://wikipedia.org/wiki/Node.js>
允許 JavaScript 讀寫任意文件、執(zhí)行網(wǎng)絡(luò)請(qǐng)求等。
瀏覽器中的 JavaScript 可以做與網(wǎng)頁操作、用戶交互和 Web 服務(wù)器相關(guān)的所有事情。
例如,瀏覽器中的 JavaScript 可以完成下面這些事:
* 在網(wǎng)頁中插入新的 HTML,修改現(xiàn)有的網(wǎng)頁內(nèi)容和網(wǎng)頁的樣式。
* 響應(yīng)用戶的行為,響應(yīng)鼠標(biāo)的點(diǎn)擊或移動(dòng)、鍵盤的敲擊。
* 向遠(yuǎn)程服務(wù)器發(fā)送網(wǎng)絡(luò)請(qǐng)求,下載或上傳文件(所謂 AJAX
<https://en.wikipedia.org/wiki/Ajax_(programming)> 和 COMET
<https://en.wikipedia.org/wiki/Comet_(programming)> 技術(shù))。
* 獲取或修改 cookie,向訪問者提出問題、發(fā)送消息。
* 記住客戶端的數(shù)據(jù)(本地存儲(chǔ))。
瀏覽器中的 JavaScript 不能做什么?
為了用戶的(信息)安全,在瀏覽器中的 JavaScript 的能力是有限的。這樣主要是為了阻止邪惡的網(wǎng)站獲得或修改用戶的私人數(shù)據(jù)。
這些限制的例子有:
*
網(wǎng)頁中的 JavaScript 不能讀、寫、復(fù)制及執(zhí)行用戶磁盤上的文件或程序。它沒有直接訪問操作系統(tǒng)的功能。
現(xiàn)代瀏覽器允許 JavaScript 做一些文件相關(guān)的操作,但是這個(gè)操作是受到限制的。僅當(dāng)用戶使用某個(gè)特定的動(dòng)作,JavaScript
才能操作這個(gè)文件。例如,把文件“拖”到瀏覽器中,或者通過<input> 標(biāo)簽選擇文件。
JavaScript 有很多方式和照相機(jī)/麥克風(fēng)或者其他設(shè)備進(jìn)行交互,但是這些都需要提前獲得用戶的授權(quán)許可。所以,啟用了 JavaScript
的網(wǎng)頁應(yīng)該不會(huì)偷偷地啟動(dòng)網(wǎng)絡(luò)攝像頭觀察你,并把你的信息發(fā)送到美國(guó)國(guó)家安全局
<https://en.wikipedia.org/wiki/National_Security_Agency>。
*
不同的瀏覽器標(biāo)簽頁之間基本彼此不相關(guān)。有時(shí)候,也會(huì)有一些關(guān)系。例如,一個(gè)標(biāo)簽頁通過 JavaScript
打開另外一個(gè)新的標(biāo)簽頁。但即使在這種情況下,如果兩個(gè)標(biāo)簽頁打開的不是同一個(gè)網(wǎng)站(域名、協(xié)議或者端口任一不相同的網(wǎng)站),他們都不能夠相互通信。
這就是“同源策略”。為了解決“同源策略”問題,兩個(gè)標(biāo)簽頁必須都包含一些處理這個(gè)問題的特殊的 JavaScript
代碼,并均允許數(shù)據(jù)交換,這樣才能夠?qū)崿F(xiàn)兩個(gè)同源標(biāo)簽頁的數(shù)據(jù)交換。本教程會(huì)講到這部分相關(guān)的知識(shí)。
這個(gè)限制也是為了用戶的信息安全。例如,用戶打開的 http://anysite.com 網(wǎng)頁的 JavaScript 肯定不能訪問
http://gmail.com(另外一個(gè)標(biāo)簽頁打開的網(wǎng)頁)也不能從那里竊取信息。
*
JavaScript
通過互聯(lián)網(wǎng)可以輕松地和當(dāng)前網(wǎng)頁域名的服務(wù)器進(jìn)行通訊。但是從其他網(wǎng)站/域名的服務(wù)器中獲取數(shù)據(jù)的能力是受限的。盡管這可以實(shí)現(xiàn),但是需要來自遠(yuǎn)程服務(wù)器的明確協(xié)議(在
HTTP 頭中)。這也是為了用戶的數(shù)據(jù)安全。
瀏覽器環(huán)境外的 JavaScript 一般沒有這些限制。例如服務(wù)端的 JavaScript
就沒有這些限制?,F(xiàn)代瀏覽器還允許安裝可能會(huì)要求擴(kuò)展權(quán)限的插件或擴(kuò)展。
是什么使得 JavaScript 與眾不同?
至少有 3 件事值得一提:
+ 和 HTML/CSS 完全的集成。 + 使用簡(jiǎn)單的工具完成簡(jiǎn)單的任務(wù)。 + 被所有的主流瀏覽器支持,并且默認(rèn)開啟。
滿足這三條的瀏覽器技術(shù)也只有 JavaScript 了。
這就是為什么 JavaScript 與眾不同!這也是為什么它是創(chuàng)建瀏覽器界面的最普遍的工具。
此外,JavaScript 還支持創(chuàng)建服務(wù)器,移動(dòng)端應(yīng)用程序等。
比 JavaScript “更好”的語言
不同的人喜歡不同的功能,JavaScript 的語法也不能夠滿足所有人的需求。
這是正常的,因?yàn)槊總€(gè)人的項(xiàng)目和需求都不一樣。
所以,最近出現(xiàn)了很多不同的語言,這些語言在瀏覽器中執(zhí)行之前,都會(huì)被編譯(轉(zhuǎn)化)成 JavaScript。
現(xiàn)代化的工具使得編譯速度非??焖偾彝该?,實(shí)際上允許開發(fā)人員使用另一種語言編寫代碼并將其自動(dòng)轉(zhuǎn)換為 JavaScript。
這些編程語言的例子有:
* CoffeeScript <http://coffeescript.org/> 是 JavaScript 的語法糖,它語法簡(jiǎn)短,明確簡(jiǎn)潔。通常使用
Ruby 的人喜歡用。
* TypeScript <http://www.typescriptlang.org/>
將注意力集中在增加嚴(yán)格的數(shù)據(jù)類型。這樣就能簡(jiǎn)化開發(fā),也能用于開發(fā)復(fù)雜的系統(tǒng)。TypeScript 是微軟開發(fā)的。
* Flow <http://flow.org/> 也添加了數(shù)據(jù)類型,但是以一種不同的方式。由 Facebook 開發(fā)。
* Dart <https://www.dartlang.org/>
是一門獨(dú)立的語言。它擁有自己的引擎用于在非瀏覽器環(huán)境中運(yùn)行(如:手機(jī)應(yīng)用),它也能被編譯成 JavaScript 。由 Google 開發(fā)。
還有很多其他的語言。當(dāng)然,即使我們?cè)谑褂眠@些語言,我們也需要知道 JavaScript。因?yàn)閷W(xué)習(xí) JavaScript 可以讓我們真正明白我們自己在做什么。
總結(jié)
* JavaScript 最開始是為瀏覽器設(shè)計(jì)的一門語言,但是現(xiàn)在也被用于很多其他的環(huán)境。
* 現(xiàn)在,JavaScript 是一門在瀏覽器中使用最廣、并且能夠很好集成 HTML/CSS 的語言。
* 有很多其他的語言可以被編譯成 JavaScript,這些語言還提供了更多的功能。最好還是了解一下這些語言,至少在掌握了 JavaScript
之后簡(jiǎn)單地看一下。
現(xiàn)代 JavaScript 教程:開源的現(xiàn)代 JavaScript 入門到進(jìn)階的優(yōu)質(zhì)教程。
在線免費(fèi)閱讀:http://zh.javascript.info/ <http://zh.javascript.info/>
關(guān)注微信公眾號(hào)「技術(shù)漫談」,訂閱更多精彩內(nèi)容。
熱門工具 換一換