1. 執行環境 execution context
當JavaScript引擎執行代碼時,它會創建執行環境。而每個執行環境都有兩個階段:創建階段與執行階段。
(1). 執行環境的創建階段
在創建階段中,JavaScript引擎會執行以下幾個任務:
- 首先,創建全局對象(如:瀏覽器的全局對象為window)。
- 其次,創建this對象來綁定全局對象。
- 再次,設置一個内存堆來存儲變量和函數引用。
- 最後,在内存堆中存儲函數聲明,在全局執行環境中存儲變量,變量的初始值為未定義。
在這些任務都完成后,則進入執行階段。
(2). 執行環境的執行階段
在執行階段,JavaScript引擎逐行執行代碼,為變量賦值,並執行函數調用。
對於每一個函數的調用,JavaScript引擎都會創建一個新的函數執行環境。函數執行環境與全局執行環境相類似,區別在於創建的不是全局對象,而是參數對象,它是對函數所有參數的引用。
2. 調用棧 call stack
- JavaScript引擎使用調用棧來管理執行環境。
- 調用棧使用基於後進先出原則工作的堆棧數據結構。也就是説,后加入的工作會被優先處理。
如:function minus (a, b) {
return a - b;
}
function isNegative(a, b) {
return minus (a, b) < 0;
}
console.log(isNegative(2, 3)); // true
以上代碼中,調用棧的步驟大概是這樣的:
1. main()
2. console.log()
3. isNegative()
4. minus()
因爲遵循後進先出原則,所以JavaScript的執行順序大概是這樣的:
1. minus()
2. isNegative()
3. console.log()
4. main()
3. 事件循環 event loop
JavaScript是一個單綫程程序語言,但是它可以在事件循環的基礎上實現并發模型。
事件循環是一個不斷運行的過程,它協調調用棧和回調隊列之間的任務,以實現并發性。
步驟大概是這樣的:
Call Stack ---> Web API ---> Callback Queue ---> Event Loop ---> Call Stack
在Callback Queue裏排隊的程序只有當Call Stack裏空了以後,才會通過Event Loop傳到Call Stack裏去執行。