2015-06-10 30 views
2

雖然我在JavaScript語法上很精通,但對於引擎蓋下的內容我卻一無所知。特別是對於什麼時候以及如何JavaScript引擎調度它實際運行,如果確實是按照任何意義來安排的話。我太無能,甚至不知道我應該用什麼術語來研究它。JavaScript引擎如何選擇接下來要執行的內容?

我一直只是假設,從簡單地聽別人鸚鵡它,JavaScript引擎一次只能運行一個線程。假設這是真的,並且在回調發生時一個函數正在運行,幕後會發生什麼? 當前正在運行的函數暫停並執行回調,或者當前正在運行的函數的完整堆棧解繞,然後運行回調中的代碼。

我只是毫無章法,這是可恥的......

如何這一切是適合與在瀏覽器的UI線程,如何在node.js中它不同

很抱歉,如果這個問題有點開放,最後我真正要問的是 - 我應該研究什麼(例如谷歌)來了解所有這些。

+1

閱讀[你不知道JS](https://github.com/getify/You-Dont-Know-JS),它涵蓋了Javascript的基本內部工作原理。而且,自從網絡工作者出現以來,Javascript不再是單線程的。 – Nit

+2

JavaScript有一個事件循環。幕後發生的情況是,當事件發生時(例如超時,用戶事件,服務器發送的事件等),該事件被放入事件隊列中。當前函數完成執行時,隊列中的下一個事件將被處理。在此之前隊列中的所有事件都會等待。如果沒有更多事件要處理,則事件循環保持空閒狀態,直到發生另一事件。這有點像當你站在銀行等待出納員爲你服務的時候。只有一個出納員(單線程),它是第一次發球。 =) –

+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop –

回答

0

當前正在執行的函數在回調運行之前完成其執行。這可以通過不同的引擎以不同的方式實現。

節點沒有什麼不同,負責執行JavaScript代碼的引擎與瀏覽器共享。

由於無法同時運行兩個或多個函數,並且一個函數需要在另一個函數執行之前完成其執行,所以JavaScript被稱爲單線程。

Web工作人員在單獨的環境中運行,因此他們的執行不依賴於在頁面或其他Web工作人員中運行的代碼。