又名js引擎
JavaScript是解釋型語言,這就是說它無需編譯,直接由JavaScript引擎直接執行。
既然說到了解釋型語言,那么我們就來分別以下解釋型語言和編譯型語言的差別:
- 編譯型語言:程序在執行之前需要一個專門的編譯過程,把程序編譯成為機器語言的文件(即exe文件),運行時不需要重新編譯,直接用編譯后的文件(exe文件)就行了。
- 優點:執行效率高
- 缺點:跨平台性差
- 解釋型語言:程序不需要編譯,程序在運行的過程中才用解釋器編譯成機器語言,邊編譯邊執行(沒有exe文件)。
- 優點:跨平台性好
- 缺點:執行效率低
其中程序無需編譯,不是說真的不需要編譯了,直接執行腳本字符串。而是說不需要在運行之前先編譯程序成為exe文件,而是在運行的過程中邊運行邊執行。
JavaScript解析執行過程
ok,我們回到JavaScript的解析執行過程。
在整體上,JavaScript的解析執行過程分為兩個步驟:
- 編譯
- 運行
其中,編譯是在解釋器中進行,將代碼編譯成可執行碼。運行是在JavaScript引擎中進行,執行可執行碼。
過程如下:
編譯過程
編譯過程不必多說,我們只要清楚這個過程會將字符串代碼編譯為可執行碼。
執行過程
重點是運行過程,運行又由兩個過程組成
- 預解析
- 執行
預解析
預解析的工作是
- 收集變量
- 分號補全
變量收集
重點注意收集變量這一功能,又名為變量提升,收集的變量有以下三種:
- var聲明的變量,初始值為undefined
- arguments參數,值為傳入的實參
- function聲明定義
若是變量名有重復的話,按照優先級來確定:
function聲明定義>函數參數>var聲明的變量
tips:
- let和const聲明的變量不會在預解析階段變量提升,只有在執行階段執行到該行時才會聲明該變量
- 當我們給一個未聲明的變量賦值時,JavaScript引擎會認為我們是要聲明一個全局變量。但如果我們訪問一個為聲明的全局變量,會報錯
- var a = function(){},變量提升時,a是值為undefined的變量而不是函數定義
分號補全
JS執行是需要分號的,但為什么以下語句卻可以正常運行呢?
console.log('a') console.log('b')
正是因為預解析階段會進行分號補全操作。
列舉幾條自動加分號的規則:
- 當有換行符(包括含有換行符的多行注釋),並且下一個token沒法跟前面的語法匹配時,會自動補分號。
- 當有}時,如果缺少分號,會補分號。
- 程序源代碼結束時,如果缺少分號,會補分號。
不過若是以下的情況,必須得加上';',否則的話,會出現報錯。
- 如果一條語句以"(","{","/","+","-"開始,當前一條語句沒有用;結尾的話,就會與前一條語句合在一起解釋
還有,其實所有代碼都可以寫在一行中。只要有';'來分隔開每一句就ok。並且,if及for及while的函數體也可以寫在同一行中。
只要做好分隔工作,那么就都可以寫在同一行。