iT邦幫忙

1

[JS] You Don't Know JavaScript[Get Started] - what is JavaScript ?

  • 分享至 

  • xImage
  •  

前言

在今年9月順利轉職成為前端工程師,在準備面試的時候有稍微學習一些關於js的知識,不過等到真的成為前端工程師後,遇到了很多問題是以前準備的知識中無法解決的,所以透過公司前輩推薦來Studying這本書,希望能夠對於JS有更深入的了解。

Backwards & Forwards

JS的最基本原則之一是保持向後兼容,很多人會將它與向前兼容搞混,向後兼容的意思代表著一但某一個代碼接受它是有效的JS代碼,那們無論到什麼時候或是更改什麼版本,這個代碼都還是有效的(EX:一個1995年寫的JS代碼到至今都還是能夠成功運行)這就是JS的向後兼容。

而向前兼容則代表你可以在較舊的JS引擎中使用比較新的JS語法,在使用新的與JS語法不會導致舊的JS代碼(舊的JS引擎)程序中斷或錯誤。

雖然很多人希望JS可以這麼做,但是JS並沒有辦法進行向前兼容。

相比之下HTML與CSS都是向前兼容的,代表著如果你是無法將10幾年前的HTML或CSS代碼再次運行的,但是如果你在2010年之後的瀏覽啟中使用2019的最新功能,它是可以正常處理的,這就是HTML與CSS的向前兼容。

Jumping the Gaps

由於JS的不向前兼容性,這代表著你不能再2016的引擎中使用ES2019的功能,如果是使用新的語法,會完全無法編譯和運行,如果是API則程序可能會運行到一定程度後就拋出異常停止。

由於JS的開發者常常會面臨到版本不對的問題,這時候編譯器便可以很好的解決這個問題(常見的是Babel),它可以等效的將你較新的JS語法轉換為較舊的語法來解決問題,而JS希望開發者能夠使用最新版本的JS進行開發,以便讓代碼乾淨且有效地傳遞編成思想,而兼容問題便可以交給編譯器來解決。


What's in an Interpretation?

對於JS來說有一個長期的爭議,那就是JS到底是編譯程式還是腳本語言? 這就得先解釋這兩者的差異。

腳本語言

腳本語言是一種編成語言,它只在被調用的時候進行解釋或編譯,它是為了縮短傳統的編寫-編譯-連接-運行而創造出來的電腦編程語言。

特點

  • 腳本語言是一種解釋性語言,他不向C/C++可以編譯成二進為代碼,它不需要編譯便可以直接使用,由解釋器來負責解釋。
  • 腳本語言一般都是以文本形式存在。
  • 相對於編譯型電腦編程語言,用腳本語言開發的程式在執行時,由其所對應的解釋器(或稱虛擬機)解釋並執行。
  • 腳本語言通常都有簡單、易學、易用的特性,目的就是希望能讓程式設計師快速完成程式的編寫工作。

編譯語言

編譯語言是一種程式語言了類型,通過編譯器來實作,先將程式碼編譯為機械碼後再加以執行。

特點

  • 執行速度較直譯是語言快,因為在編譯期就已經先編譯成機械碼可以直接執行,不用像直譯語言一樣,還要多一道直譯程式。
  • 編譯語言的程式開發速度以及除錯時間較長。

為了清楚的了解JS是編譯語言還是直譯語言的真正原因在於錯誤的處理方式。

在腳本語言或是直譯語言中,通常是由上而下的執行方式,所以有可能前面4行都是正常的,但是當執行到第5行的時候才發現錯誤,而這個錯誤可能是因為上文的執行錯誤導致,也有可能是它本身的語法錯誤,這種需要根據上下文來定義錯誤的方式(錯誤推遲)是不期望的。

而JS會在執行之前解析,因為他要求在代碼開始執行前確定整個代碼沒有錯誤(例如重複的參數名稱),若不事先分析代碼則無法識別這些錯誤。

所以JS是一種直譯語言,但是JS在被解析後會轉化為 optimized (binary)之後再執行,簡單來說,JS將程式碼編譯成各種二進制字節然後再交給JS虛擬機執行,而整個JS的程序源流程 :

  1. 開發人員編輯好程序後交給Babel進行編譯,編譯完成後交給JS引擎。
  2. JS引擎將代碼解析為AST(Abstract Syntax Tree)。
  3. 之後再將AST轉換為字節代碼,然後通過優化的JIT編譯器(即時編譯器)進行細部轉換。
  4. 最後由JS VM(virtual machine)執行。

由上面的流程看來JS的處理方式比較像在處理直譯語言,但是JS會經過編譯,讓我們能夠在代碼執行之前收到靜態錯誤,這種行為更像是編譯語言。

Strictly Speaking

在2009發布的ES5中就有添加了嚴格模式,但是雖然嚴格模式有許多好處,但是卻會造成舊語法的錯誤,所以到現在為止,嚴格模式仍然處於選擇性的功能。

而嚴格模式的好處可以讓JS有更佳的優化和高效率的運行代碼,也可以讓大型開發的團隊避免一些錯誤。

參考文獻 :
You Don't Know JavaScript
腳本語言


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言