2012-03-15 52 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