恩,什麼?我使用語言來完成工作。對於我和javascript,此過程始於構建一個小型遊戲,ajax請求和表單驗證。我們與Hapi js的聯絡越來越深。自從遇到React以來,我一直致力於。現在,要成為一個更好的程式設計師,您必須問為什麼事情如何進行。Javascript執行時對我來說是最大的奧秘之一。
什麼是Javascript引擎和執行時?Javascript執行時是指在執行JavaScript程式碼時在何處執行。就是說,可以在google chrome上執行javascript,在這種情況下,您的javascript引擎是v8,如果在mozilla上-它是Spidermonkey,如果是IE-那麼它的脈輪,如果是Safari-它是nitro,如果在節點上,則是v8。現在什麼是JS引擎,什麼是JS執行時?
引擎將我們編寫的JavaScript轉換為機器程式碼。所有JavaScript引擎都實現ECMAScript提供的語言規範。標準化促進了獨立引擎的開發,並確保您的指令碼無論在何處執行都可以得到相同的結果。為了獲得速度,V8將JavaScript程式碼轉換為更有效的機器程式碼,而不是使用直譯器。它透過像許多現代JavaScript引擎(例如SpiderMonkey或Rhino(Mozilla))一樣實現JIT(即時)編譯器,在執行時將JavaScript程式碼編譯為機器程式碼。這裡的主要區別是V8不會產生位元組碼或任何中間碼。JavaScript引擎只是更大概念的組成部分。該引擎在稱為Javascript Runtime的環境中工作,該環境為我們的指令碼提供了附加功能。這些功能可能包括撥打網路電話,捕獲滑鼠/鍵盤事件等。
這是JS Runtime的體系結構。V8沒有這些WebAPI。這些由執行時給出。在chrome瀏覽器JS執行時中,瀏覽器擁有它,而在Node中則由C ++庫提供。
> Runtime Architecture
讓我們看看Javascript是如何非同步和單執行緒的。
單執行緒,什麼?Javascript程式碼在單執行緒中執行,但是Javascript執行時不在單執行緒中執行。執行緒池存在於JS執行時中,但是我們不必擔心它,因為執行時會處理它。但是,那是怎麼做的呢?事件迴圈可以挽救。
讓我們瞭解什麼是執行時(或屬於執行時的JS引擎)中的堆和呼叫堆疊。javascript程式碼首先轉換為機器程式碼。堆儲存所有變數,並由呼叫堆疊執行操作。
console.log("Start")function sayHello(name) { console.log(`Hello ${name}!`)}sayHello("Abhinav");console.log("End")
所有這些都轉到呼叫堆疊並在那裡執行。
Start
Hello Abhinav
End
我們可以將指令碼分為兩種型別,即立即呼叫和稍後呼叫。
非同步任務到來時會發生什麼?任務需要時間才能執行。比如說進行API呼叫或計時器等。有一個稱為回撥的概念。這是完成此任務後要執行的功能。
好吧,它們作為任何常規函式進入呼叫堆疊,但是由於此任務駐留在WebAPI中,因此我們對WebAPI進行了呼叫。它儲存任務的回撥函式併為我們完成任務(根據執行時使用執行緒/多處理)。任務完成後,它將回調發送到回撥佇列。
在這裡再次視覺化。
現在什麼是事件迴圈?事件迴圈連續執行(在瀏覽器執行時中,它並不總是在節點中執行)以檢查呼叫棧是否為空,如果呼叫棧為空,它將從回撥佇列中提取第一項並將其移至呼叫棧並執行回撥函式。在堆疊不為空之前,不會從回撥佇列新增任何功能。
回撥總是完全執行的。事件迴圈一次執行一個回撥。沒有上下文切換。佇列中的所有回撥都必須等到當前的回撥完成。如果指令碼執行時間過長,則會阻止其他指令碼。這就是為什麼回撥應該相對簡短而簡單。
很簡單吧!但實際上,它要複雜得多。有多個佇列,具體取決於執行時,並且它們的優先順序不同。有一些東西作為渲染佇列。誰的工作是渲染螢幕。
非阻塞狀態如何?假設您在呼叫API時失敗,或者發生了其他事件,該事件仍然存在於Web api中,因此它永遠不會進入回撥佇列,因此不會進入呼叫堆疊。因此,沒有任何東西被阻止。
它是併發的嗎?並行和並行有什麼區別?並行是您同時執行2個任務的位置。(邊吃爆米花邊看電影)。這是透過多核來實現的。JS程式碼在呼叫堆疊中並行執行,而不是並行執行。但是WebAPI可以利用多核並並行執行。