这是一个深思熟虑的设计决定,还是我们当前浏览器的一个问题,这个问题将在未来的版本中得到纠正?
当前回答
如果没有适当的语言支持线程同步,那么新的实现尝试线程同步就没有意义了。现有的复杂JS应用(例如任何使用ExtJS的应用)很可能会意外崩溃,但如果没有同步关键字或类似的东西,也很难甚至不可能编写正确运行的新程序。
其他回答
如果没有适当的语言支持线程同步,那么新的实现尝试线程同步就没有意义了。现有的复杂JS应用(例如任何使用ExtJS的应用)很可能会意外崩溃,但如果没有同步关键字或类似的东西,也很难甚至不可能编写正确运行的新程序。
你的意思是为什么语言不支持多线程,或者为什么浏览器中的JavaScript引擎不支持多线程?
第一个问题的答案是,浏览器中的JavaScript是在沙盒中运行的,以一种独立于机器/操作系统的方式运行,添加多线程支持会使语言变得复杂,并将语言与操作系统联系得太紧密。
它的实现不支持多线程。目前谷歌Gears提供了一种通过执行外部进程来使用某种形式的并发的方法,但仅此而已。
新的浏览器谷歌应该今天发布(谷歌Chrome)通过在进程中分离一些代码并行执行。
当然,核心语言可以提供与Java相同的支持,但对Erlang并发性之类的支持还远远不够。
实际上多线程与语言本身没有关系。 这是一个。net的多线程Javascript引擎。 它在多线程场景下工作得非常好。 它集成了c#运行时,所以所有的同步逻辑都类似于c#。可以启动/等待/等待任务,也可以启动线程。你甚至可以放锁。下面的示例演示了在。net运行时中使用Javascript语法的并行循环。
https://github.com/koculu/topaz
var engine = new TopazEngine();
engine.AddType(typeof(Console), "Console");
topazEngine.AddType(typeof(Parallel), "Parallel");
engine.ExecuteScript(@"
var sharedVariable = 0
function f1(i) {
sharedVariable = i
}
Parallel.For(0, 100000 , f1)
Console.WriteLine(`Final value: {sharedVariable}`);
");
除此之外,微软正在开发Napa.js,一个支持多线程的Node.js克隆。
https://github.com/microsoft/napajs
Javascript是一种单线程语言。这意味着它有一个调用堆栈和一个内存堆。正如预期的那样,它按顺序执行代码,并且必须在执行下一段代码之前完成。它是同步的,但有时是有害的。例如,如果一个函数需要一段时间才能执行,或者必须等待某项操作,那么它会同时冻结所有内容。