JavaScript 如何在後臺工作:瞭解其單執行緒性質和非同步操作
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 如何在後臺工作:瞭解其單執行緒性質和非同步操作的詳細內容,更多請關注我的其它相關文章!
相關文章
- 從程式和執行緒瞭解瀏覽器的工作原理執行緒瀏覽器
- mysql後臺執行緒詳解MySql執行緒
- 瞭解 Android 的程式和執行緒Android執行緒
- JavaScript單執行緒概念JavaScript執行緒
- 後臺執行緒(daemon)執行緒
- 淺談Javascript單執行緒和事件迴圈JavaScript執行緒事件
- 單執行緒-非阻塞-長連結執行緒
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 一步步瞭解執行緒池之單核執行緒池-SingleThreadPool執行緒單核thread
- 瞭解Javascript中的執行上下文和執行堆疊JavaScript
- 招聘|歡迎加入非凸,學習Rust,瞭解記憶體和執行緒安全問題Rust記憶體執行緒
- 執行緒池如何觀測?這個方案讓你對執行緒池的執行情況瞭如指掌!執行緒
- Android中後臺的服務和多執行緒Android執行緒
- 透過簡單示例瞭解執行緒池實現原理執行緒
- 伺服器模型——從單執行緒阻塞到多執行緒非阻塞(下)伺服器模型執行緒
- 伺服器模型——從單執行緒阻塞到多執行緒非阻塞(中)伺服器模型執行緒
- 瀏覽器多執行緒和js單執行緒瀏覽器執行緒JS
- 深入瞭解程序和執行緒:概念、區別和最佳化執行緒
- 執行緒池其實看懂了也很簡單執行緒
- 最全java多執行緒總結3——瞭解阻塞佇列和執行緒安全集合不Java執行緒佇列
- 單執行緒的js是如何工作的執行緒JS
- 不看不知道,JavaScript 是如何在後臺工作的JavaScript
- Java執行緒池瞭解一下Java執行緒
- java基礎-多執行緒初步瞭解Java執行緒
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- c#基礎,單執行緒,跨執行緒訪問和執行緒帶引數C#執行緒
- JS單執行緒和非同步JS執行緒非同步
- 執行緒和執行緒池執行緒
- JAVA多執行緒詳解(3)執行緒同步和鎖Java執行緒
- 瀏覽器執行緒執行順序,瞭解一下瀏覽器執行緒
- JavaScript 單執行緒之非同步程式設計JavaScript執行緒非同步程式設計
- 前端開發技術-剖析JavaScript單執行緒前端JavaScript執行緒
- web前端教程:如何理解JavaScript的單執行緒?Web前端JavaScript執行緒
- 一步步瞭解執行緒池之基本執行緒池-ThreadPoolExecutor執行緒thread
- 《【面試突擊】— Redis篇》-- Redis的執行緒模型瞭解嗎?為啥單執行緒效率還這麼高?面試Redis執行緒模型
- 小度分享-【多執行緒工作及執行緒安全】執行緒
- 【多執行緒總結(四)-三大性質總結】執行緒
- Python 多執行緒無用?深入總結 二(深入瞭解GIL 執行緒守護 執行緒程式CPU關係)Python執行緒