2012-03-15 32 views
4

javascript是否在單線程上運行?如果我聲明一個全局數組,並開始在AJAX回調中更改它(例如移除元素),並同時開始更改另一個函數中的同一個數組(使用SetTimeOut調用) - 是否存在競爭條件的風險?javascript是單線程的嗎?

我發現這個線程:javascript race condition,有人說比賽條件都不會在JavaScript中發生,因爲它總是在單線程和單一調用堆棧上運行。這是否取決於瀏覽器如何實現它,還是保證在所有瀏覽器上始終是單線程的?

+2

有可能是競爭條件,由於網絡延遲,如果你使用Ajax的工作,但它本身的JavaScript不是因爲因爲它是單-threaded。 – pimvdb 2012-03-15 18:45:06

+0

不太總是:http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded – phazei 2013-03-28 18:42:54

回答

4

是保證是所有的瀏覽器總是單線程?

是的。

當然,像HTTP請求可能在幕後不同的線程工作,但在執行JavaScript代碼時,它可以從一個線程時纔會發生。

+0

爲什麼單threadedness的保證? – dldnh 2012-03-15 18:46:38

+1

@dldnh http://en.wikipedia.org/wiki/Global_Interpreter_Lock – 2012-03-15 18:52:48

2

JavaScript是單線程的。

引用的討論後在不同機器上的setTimeout差異...


HTML5介紹了WebWorkers其執行上的多個背景線程JavaScript的概念。雖然它不支持所有的瀏覽器...

https://developer.mozilla.org/En/Using_web_workers

http://dev.w3.org/html5/workers/

+0

對於網絡工作者來說,它更像是兩個獨立的單線程腳本運行並向對方發送消息,而不是使用一個多線程腳本。一個變量在兩個線程中都不可見,工作人員無法操作DOM等。 – 2012-03-15 18:55:38