一起來聊一下 JavaScript 的用途和那些特性
- 2019 年 10 月 3 日
- 筆記
JavaScript 簡介
我們一起來聊一下 JavaScript,用它能做什麼,它有哪些特性,以及一些跟它配合使用的技術。
什麼是 JavaScript?
JavaScript 最初的目的是為了「賦予網頁生命」。
這種程式語言我們稱之為腳本。它們可以寫在 HTML 中,在頁面載入的時候會自動執行。
腳本作為純文本存在和執行。它們不需要特殊的準備或編譯即可運行。
這方面,JavaScript 和 Java 有很大的區別。
為什麼叫 JavaScript?
JavaScript 在剛誕生的時候,它的名字叫 「LiveScript」。但是因為當時 Java 很流行,所以決定將一種新語言定位為 Java 的「弟弟」會有助於它的流行。
隨著 JavaScript 的發展,它已經變成了一門獨立的語言,同時也有了自己的語言規範 ECMAScript。現在,它和 Java 之間沒有任何關係。
現在,JavaScript 不僅僅是在瀏覽器內執行,也可以在服務端執行,甚至還能在任意搭載了 JavaScript 引擎 的設備中都可以執行。
瀏覽器中嵌入了 JavaScript 引擎,有時也稱作 JavaScript 虛擬機。
不同的引擎有不同的「代號」,例如:
- V8 —— Chrome 和 Opera 中的 JavaScript 引擎。
- SpiderMonkey —— Firefox 中的 JavaScript 引擎。
- ……還有其他一些代號,像「Trident」,「Chakra」用於不同版本的 IE,「ChakraCore」用於 Microsoft Edge,「Nitro」和「SquirrelFish」用於 Safari,等等。
上面這些名稱很容易記憶,因為經常出現在網上開發者的文章中。我們也會用到這些名稱。例如:某個新的功能,如果「JavaScript 引擎 V8 是支援的」,那麼我們可以認為這個功能大概能在 Chrome 和 Opera 中正常運行。
引擎是如何工作的?
引擎很複雜,但是基本原理很簡單。
- 引擎(通常嵌入在瀏覽器中)讀取(「解析」)腳本。
- 然後將腳本轉化(「編譯」)為機器語言。
- 然後這機器語言程式碼快速地運行。
引擎會對流程中的每個階段都進行優化。它甚至可以在運行時監視編譯的腳本,分析數據流並根據這些對機器程式碼應用優化。最後,腳本會執行地非常快。
瀏覽器中的 JavaScript 能做什麼?
現代的 JavaScript 是一種「安全」語言。它不提供對記憶體或 CPU 的底層訪問,因為它最初是為瀏覽器創建的,不需要這些功能。
JavaScript 的能力很大程度上依賴於它執行的環境。例如:Node.js 允許 JavaScript 讀寫任意文件、執行網路請求等。
瀏覽器中的 JavaScript 可以做與網頁操作、用戶交互和 Web 伺服器相關的所有事情。
例如,瀏覽器中的 JavaScript 可以完成下面這些事:
- 在網頁中插入新的 HTML,修改現有的網頁內容和網頁的樣式。
- 響應用戶的行為,響應滑鼠的點擊或移動、鍵盤的敲擊。
- 向遠程伺服器發送網路請求,下載或上傳文件(所謂 AJAX 和 COMET 技術)。
- 獲取或修改 cookie,向訪問者提出問題、發送消息。
- 記住客戶端的數據(本地存儲)。
瀏覽器中的 JavaScript 不能做什麼?
為了用戶的(資訊)安全,在瀏覽器中的 JavaScript 的能力是有限的。這樣主要是為了阻止邪惡的網站獲得或修改用戶的私人數據。
這些限制的例子有:
-
網頁中的 JavaScript 不能讀、寫、複製及執行用戶磁碟上的文件或程式。它沒有直接訪問作業系統的功能。
現代瀏覽器允許 JavaScript 做一些文件相關的操作,但是這個操作是受到限制的。僅當用戶使用某個特定的動作,JavaScript 才能操作這個文件。例如,把文件「拖」到瀏覽器中,或者通過
<input>
標籤選擇文件。JavaScript 有很多方式和照相機/麥克風或者其他設備進行交互,但是這些都需要提前獲得用戶的授權許可。所以,啟用了 JavaScript 的網頁應該不會偷偷地啟動網路攝影機觀察你,並把你的資訊發送到美國國家安全局。
-
不同的瀏覽器標籤頁之間基本彼此不相關。有時候,也會有一些關係。例如,一個標籤頁通過 JavaScript 打開另外一個新的標籤頁。但即使在這種情況下,如果兩個標籤頁打開的不是同一個網站(域名、協議或者埠任一不相同的網站),他們都不能夠相互通訊。
這就是「同源策略」。為了解決「同源策略」問題,兩個標籤頁必須都包含一些處理這個問題的特殊的 JavaScript 程式碼,並均允許數據交換,這樣才能夠實現兩個同源標籤頁的數據交換。本教程會講到這部分相關的知識。
這個限制也是為了用戶的資訊安全。例如,用戶打開的
http://anysite.com
網頁的 JavaScript 肯定不能訪問http://gmail.com
(另外一個標籤頁打開的網頁)也不能從那裡竊取資訊。 -
JavaScript 通過互聯網可以輕鬆地和當前網頁域名的伺服器進行通訊。但是從其他網站/域名的伺服器中獲取數據的能力是受限的。儘管這可以實現,但是需要來自遠程伺服器的明確協議(在 HTTP 頭中)。這也是為了用戶的數據安全。
瀏覽器環境外的 JavaScript 一般沒有這些限制。例如服務端的 JavaScript 就沒有這些限制。現代瀏覽器還允許安裝可能會要求擴展許可權的插件或擴展。
是什麼使得 JavaScript 與眾不同?
至少有 3 件事值得一提:
+ 和 HTML/CSS 完全的集成。 + 使用簡單的工具完成簡單的任務。 + 被所有的主流瀏覽器支援,並且默認開啟。
滿足這三條的瀏覽器技術也只有 JavaScript 了。
這就是為什麼 JavaScript 與眾不同!這也是為什麼它是創建瀏覽器介面的最普遍的工具。
此外,JavaScript 還支援創建伺服器,移動端應用程式等。
比 JavaScript 「更好」的語言
不同的人喜歡不同的功能,JavaScript 的語法也不能夠滿足所有人的需求。
這是正常的,因為每個人的項目和需求都不一樣。
所以,最近出現了很多不同的語言,這些語言在瀏覽器中執行之前,都會被編譯(轉化)成 JavaScript。
現代化的工具使得編譯速度非常快速且透明,實際上允許開發人員使用另一種語言編寫程式碼並將其自動轉換為 JavaScript。
這些程式語言的例子有:
- CoffeeScript 是 JavaScript 的語法糖,它語法簡短,明確簡潔。通常使用 Ruby 的人喜歡用。
- TypeScript 將注意力集中在增加嚴格的數據類型。這樣就能簡化開發,也能用於開發複雜的系統。TypeScript 是微軟開發的。
- Flow 也添加了數據類型,但是以一種不同的方式。由 Facebook 開發。
- Dart 是一門獨立的語言。它擁有自己的引擎用於在非瀏覽器環境中運行(如:手機應用),它也能被編譯成 JavaScript 。由 Google 開發。
還有很多其他的語言。當然,即使我們在使用這些語言,我們也需要知道 JavaScript。因為學習 JavaScript 可以讓我們真正明白我們自己在做什麼。
總結
- JavaScript 最開始是為瀏覽器設計的一門語言,但是現在也被用於很多其他的環境。
- 現在,JavaScript 是一門在瀏覽器中使用最廣、並且能夠很好集成 HTML/CSS 的語言。
- 有很多其他的語言可以被編譯成 JavaScript,這些語言還提供了更多的功能。最好還是了解一下這些語言,至少在掌握了 JavaScript 之後簡單地看一下。
現代 JavaScript 教程:開源的現代 JavaScript 入門到進階的優質教程。
在線免費閱讀:http://zh.javascript.info/
關注微信公眾號「技術漫談」,訂閱更多精彩內容。