JavaScript 如何在後臺工作:瞭解其單執行緒性質和非同步操作

aow054發表於2024-09-20
javascript 是網路的支柱,為數十億網站和應用程式提供動態客戶端功能。但您有沒有想過 javascript 是如何在後臺發揮其魔力的?在這篇文章中,我們將深入研究 javascript 單執行緒本質的內部工作原理,並探索非同步程式設計的概念。 單執行緒是什麼意思?當我們說 javascript 是“單執行緒”時,這意味著它有一個呼叫堆疊。呼叫堆疊本質上是 javascript 跟蹤正在執行的函式的結構。它遵循後進先出 (lifo) 順序,這意味著最後推送到堆疊的函式將最先完成。以下是其工作原理的示例:function first() { console.log('first function');}function second() { console.log('second function');}first();second();登入後複製在此示例中,first() 函式被新增到堆疊並執行。一旦完成,它就會被彈出,第二個()函式被壓入堆疊並接下來執行。雖然單執行緒語言可能看起來很有限,因為它們一次只能做一件事,但 javascript 巧妙地使用非同步機制使其能夠模擬多工處理。 事件迴圈和非同步執行javascript 使用非同步執行來處理可能需要很長時間才能完成的操作,例如網路請求、檔案 i/o 或計時器。儘管是單執行緒的,但由於事件迴圈和回撥佇列,它可以同時管理多個任務。立即學習“Java免費學習筆記(深入)”; 事件迴圈事件迴圈是 javascript 併發模型的核心概念。它的主要職責是管理 javascript 如何處理非同步程式碼執行。其工作原理如下:同步程式碼首先執行。當 javascript 啟動時,它使用呼叫堆疊以同步方式逐行執行全域性範圍內的所有程式碼。非同步任務被髮送到 web api(如 settimeout、fetch 等)或 node.js api,它們將在後臺進行處理。 回撥佇列是非同步操作完成後放置的地方。 事件迴圈不斷檢查呼叫堆疊是否為空。如果堆疊為空,它將從回撥佇列中取出第一項並將其推送到呼叫堆疊上,以允許其執行。非同步 javascript 的魔力在於事件迴圈、呼叫堆疊和回撥佇列之間的互動。非同步操作不會阻塞呼叫堆疊,這意味著 javascript 可以在等待後臺任務完成的同時繼續執行其他程式碼。 示例:使用 settimeout考慮以下帶有 settimeout 函式的示例:console.log('start');settimeout(() => { console.log('this runs after 2 seconds');}, 2000);console.log('end');登入後複製以下是逐步發生的事情:javascript 列印“開始”。settimeout 函式被呼叫,但不是阻塞執行 2 秒,而是傳送到 web api,在後臺執行。javascript 列印“end”,繼續執行而不等待 settimeout 完成。2秒後,settimeout內部的回撥函式被放入回撥佇列中。事件迴圈檢查呼叫堆疊是否為空(確實如此),然後將回撥函式推入堆疊並執行它,列印“this running after 2秒”。 promise 和非同步/等待現代 javascript 中處理非同步任務的另一種流行方法是透過 promises 和 async/await 語法,這有助於透過避免深層巢狀的回撥(也稱為“回撥地獄”)來提高程式碼的可讀性。promise 表示非同步操作的最終完成(或失敗)及其結果值。這是一個例子:const promise = new promise((resolve, reject) => { settimeout(() => { resolve('promise resolved!'); }, 1000);});promise.then(result => { console.log(result); // output after 1 second: 'promise resolved!'});登入後複製我們可以使用 then() 來處理 promise 解決時發生的情況,而不是依賴回撥。如果我們想以更同步的方式處理非同步程式碼,我們可以使用 async/await:async function asyncExample() { const result = await promise; console.log(result); // Output after 1 second: 'Promise resolved!'}asyncExample();登入後複製這使得程式碼更乾淨、更容易理解,允許我們在移動到下一行程式碼之前“等待”非同步任務完成,即使 javascript 在幕後仍然是非阻塞的。 javascript 非同步模型中的關鍵元件呼叫堆疊:執行同步程式碼的地方。web api/node.js api:處理非同步任務(如網路請求)的外部環境。回撥佇列:非同步任務結果等待推送到呼叫棧執行的佇列。事件迴圈:協調呼叫堆疊和回撥佇列的系統,確保任務按正確的順序處理。 結論javascript 的單執行緒特性乍一看似乎有侷限性,但其非同步功能使其能夠有效地管理多個任務。透過事件迴圈、回撥佇列和 promise 等機制,javascript 能夠處理複雜的非阻塞操作,同時保持直觀、同步的編碼風格。 以上就是JavaScript 如何在後臺工作:瞭解其單執行緒性質和非同步操作的詳細內容,更多請關注我的其它相關文章!

相關文章