JavaScript ( JS ) 是一個單線程、解釋型的編程語言。編程
JavaScript語言的一大特色就是單線程,也就是說,同一個時間只能作一件事。編程語言
自上而下,解釋一行,執行一行;不會通篇編譯爲一個文件再執行。函數
顧名思義 就是檢查一遍js代碼內有沒有出現語法錯誤(好比少些個分號,多寫個括號等);語法分析期間不會執行代碼線程
預編譯發生在函數執行的前一刻
全局下:
全局的變量聲明和函數聲明則會存放在全局對象內(Global Object 簡稱GO,它是window的一部分,你能夠直接把他理解成window對象)中
函數體內:
預編譯會提早把函數裏的變量聲明和函數聲明依據規則存放在該活動對象內(Activation Object,簡稱AO),code
預編譯簡單理解就是在內存中開闢一些空間,存放一些變量與函數 。對象
預編譯大體可分爲4步:ip
因此若是遇到下面這種狀況,當函數聲明和變量聲明名稱相同時:內存
console.log(a); var a= 1; function a(){};
編譯後的代碼實際上是:io
var a; function a(){}; console.log(a); a= 1;
因此最後輸出的是:console
function a() {}
預編譯兩個小規則
預編譯前奏
<script> var a=2; console.log(window.a);//2 </script>
預編譯完畢以後,JavaScript 腳本開始執行,執行順序按照從上到下的順序執行。
JavaScript執行順序
練習:
function a(a){ console.log(a); a= 2; console.log(b); var b= 3; console.log(a); } a(1); console.log(a);
你能夠先試想一下結果,而後複製代碼到控制檯去驗證你的答案是否正確。