2013-03-24 99 views
7

如果我有JavaScript代碼正在運行,例如在計時器上執行某些操作,並且此代碼嵌入在Web瀏覽器的選項卡1和選項卡2中的網頁中,那麼客戶端代碼是否可以同時運行?或者JavaScript客戶端代碼總是隻在單個瀏覽器線程中運行?Javascript/web瀏覽器線程模型

或者,如果有一個父框架和子框架的框架,那麼在這種情況下,javascript代碼可以同時運行嗎?

有沒有標準的指定型號,還是依賴於瀏覽器?

我的主要目標環境是IE9,所以有興趣知道那裏會發生什麼。

編輯 我不是在尋找線程支持或如何在javascript中執行線程。我個人認爲沒有必要。它也使生活更加複雜。我只想知道我是否需要擔心它,以及在哪些瀏覽器上。

+0

兩個標籤完全無關;沒有標準。 Chrome例如甚至在不同的*進程*中運行它們中的每一個,而Opera只知道在一個線程中做所有事情。 – Bergi 2013-03-24 14:40:22

回答

5

對於單個JavaScript「對象空間」(瀏覽器中的單個頁面或node.js中的解釋器實例),最多隻有一個線程正在運行。實際上,在JavaScript語境中談論線程是沒有意義的。 JS執行模型是基於事件循環和回調的。

不同的框架永遠不能併發運行,因爲它們可以訪問彼此的DOM(並通過擴展任意對象)。這會使線程不安全。

由於網絡工作人員無法直接訪問整個工作者邊界的任何數據結構,因此線程不可觀察且可以安全地發生。這裏唯一的交流是通過消息傳遞。

+0

爲什麼你認爲框架只使用消息進行通信?兩頁(不受SOP限制)可以與另一頁的元素直接交互。 – Bergi 2013-03-24 14:41:47

+0

@Bergi對!我相應地改變了我的答案。這實際上表明不同的幀不能同時運行。 – usr 2013-03-24 15:00:07