在今年9月順利轉職成為前端工程師,在準備面試的時候有稍微學習一些關於js的知識,不過等到真的成為前端工程師後,遇到了很多問題是以前準備的知識中無法解決的,所以透過公司前輩推薦來Studying這本書,希望能夠對於JS有更深入的了解。
JS的最基本原則之一是保持向後兼容
,很多人會將它與向前兼容
搞混,向後兼容的意思代表著一但某一個代碼接受它是有效的JS代碼,那們無論到什麼時候或是更改什麼版本,這個代碼都還是有效的(EX:一個1995年寫的JS代碼到至今都還是能夠成功運行)這就是JS的向後兼容。
而向前兼容則代表你可以在較舊的JS引擎中使用比較新的JS語法,在使用新的與JS語法不會導致舊的JS代碼(舊的JS引擎)程序中斷或錯誤。
雖然很多人希望JS可以這麼做,但是JS並沒有辦法進行向前兼容。
相比之下HTML與CSS都是向前兼容的,代表著如果你是無法將10幾年前的HTML或CSS代碼再次運行的,但是如果你在2010年之後的瀏覽啟中使用2019的最新功能,它是可以正常處理的,這就是HTML與CSS的向前兼容。
由於JS的不向前兼容性,這代表著你不能再2016的引擎中使用ES2019的功能,如果是使用新的語法,會完全無法編譯和運行,如果是API則程序可能會運行到一定程度後就拋出異常停止。
由於JS的開發者常常會面臨到版本不對的問題,這時候編譯器便可以很好的解決這個問題(常見的是Babel),它可以等效的將你較新的JS語法轉換為較舊的語法來解決問題,而JS希望開發者能夠使用最新版本的JS進行開發,以便讓代碼乾淨且有效地傳遞編成思想,而兼容問題便可以交給編譯器來解決。
對於JS來說有一個長期的爭議,那就是JS到底是編譯程式還是腳本語言? 這就得先解釋這兩者的差異。
腳本語言是一種編成語言,它只在被調用的時候進行解釋或編譯,它是為了縮短傳統的編寫-編譯-連接-運行
而創造出來的電腦編程語言。
解釋器
來負責解釋。編譯語言是一種程式語言了類型,通過編譯器
來實作,先將程式碼編譯為機械碼
後再加以執行。
為了清楚的了解JS是編譯語言還是直譯語言的真正原因在於錯誤的處理方式。
在腳本語言或是直譯語言中,通常是由上而下的執行方式,所以有可能前面4行都是正常的,但是當執行到第5行的時候才發現錯誤,而這個錯誤可能是因為上文的執行錯誤導致,也有可能是它本身的語法錯誤,這種需要根據上下文來定義錯誤的方式(錯誤推遲)是不期望的。
而JS會在執行之前解析,因為他要求在代碼開始執行前確定整個代碼沒有錯誤(例如重複的參數名稱),若不事先分析代碼則無法識別這些錯誤。
所以JS是一種直譯語言,但是JS在被解析後會轉化為 optimized (binary)之後再執行,簡單來說,JS將程式碼編譯成各種二進制字節然後再交給JS虛擬機執行,而整個JS的程序源流程 :
由上面的流程看來JS的處理方式比較像在處理直譯語言,但是JS會經過編譯,讓我們能夠在代碼執行之前收到靜態錯誤,這種行為更像是編譯語言。
在2009發布的ES5中就有添加了嚴格模式
,但是雖然嚴格模式有許多好處,但是卻會造成舊語法的錯誤,所以到現在為止,嚴格模式仍然處於選擇性的功能。
而嚴格模式的好處可以讓JS有更佳的優化和高效率的運行代碼,也可以讓大型開發的團隊避免一些錯誤。
參考文獻 :
You Don't Know JavaScript
腳本語言