这是一个深思熟虑的设计决定,还是我们当前浏览器的一个问题,这个问题将在未来的版本中得到纠正?


当前回答

JavaScript多线程(有一些限制)在这里。谷歌实现了Gears的worker, HTML5也包含了worker。大多数浏览器已经添加了对该特性的支持。

数据的线程安全得到了保证,因为所有与worker通信的数据都被序列化/复制。

欲了解更多信息,请阅读:

http://www.whatwg.org/specs/web-workers/current-work/

http://ejohn.org/blog/web-workers/

其他回答

javascript多线程显然是可能的使用HTML5带来的网络工作者。

webworker和标准多线程环境之间的主要区别是内存资源不与主线程共享,对象的引用从一个线程到另一个线程是不可见的。线程通过交换消息进行通信,因此可以实现遵循事件驱动设计模式的同步和并发方法调用算法。

有很多框架允许在线程之间结构化编程,其中包括OODK-JS,这是一个支持并发编程的OOP js框架 https://github.com/GOMServices/oodk-js-oop-for-js

然而,你可以使用eval函数在一定程度上带来并发性

/* content of the threads to be run */
var threads = [
        [
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');",
            "document.write('Foo <br/>');"
        ],
        [
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');",
            "document.write('Bar <br/>');"
        ]
    ];

window.onload = function() {
    var lines = 0, quantum = 3, max = 0;

    /* get the longer thread length */
    for(var i=0; i<threads.length; i++) {
        if(max < threads[i].length) {
            max = threads[i].length;
        }
    }

    /* execute them */
    while(lines < max) {
        for(var i=0; i<threads.length; i++) {
            for(var j = lines; j < threads[i].length && j < (lines + quantum); j++) {
                eval(threads[i][j]);
            }
        }
        lines += quantum;
    }
}

我不知道这个决定的基本原理,但我知道可以使用setTimeout模拟多线程编程的一些好处。您可以给人一种错觉,认为多个进程同时在做事情,但实际上,所有事情都发生在一个线程中。

只需要让你的函数做一点工作,然后调用类似这样的东西:

setTimeout(function () {
    ... do the rest of the work...
}, 0);

任何其他需要做的事情(如UI更新,动画图像等)都会在他们有机会的时候发生。

Javascript是一种单线程语言。这意味着它有一个调用堆栈和一个内存堆。正如预期的那样,它按顺序执行代码,并且必须在执行下一段代码之前完成。它是同步的,但有时是有害的。例如,如果一个函数需要一段时间才能执行,或者必须等待某项操作,那么它会同时冻结所有内容。

据我所知,谷歌Chrome将有多线程javascript,所以这是一个“当前实现”的问题。