为什么Javascript SetTimeout()不是多线程的

为什么Javascript SetTimeout()不是多线程的,javascript,Javascript,我有一个测试: Html: 空 空的 ​ js: var s1=function(){ 对于(i=1;i

我有一个测试:

Html:

空
空的
​
js:

var s1=function(){
对于(i=1;i<100000000;i++){
var b=i*i;
    }
$('f1').html('Set');
}
var s2=函数(){
如果($('#f1').html()=='Empty'){
$('#f2').html('Multi-Thread');
返回
    };
$('#f2').html('一个线程');
}
设置超时(s2110);
设置超时(s1100);​
setTimeOut()不像事件模型那样在不同的线程中运行,这有什么真正的原因吗


Javascript不支持多线程,因为浏览器中的解释器是单线程的

Javascript不是多线程的


HTML5将提供javascript多线程功能。

javascript本身既不是多线程的,也不是非多线程的。然而,目前在主流浏览器中实现的Javascript的具体实现大多是单线程的

此外,为了进行适当的多线程处理,该语言需要具有共享内存、锁、信号量和其他并发编程工具的功能,而目前定义的JavaScript没有这些功能(例如,由于一个窗口中只有一个DOM,因此无法描述并发JS线程如何控制谁来更新当然是共享的DOM对象)


有人试图使JS更加并行化——看看web workers、Intel的River Trail和。

很多设计决策都进入了Javascript在浏览器中的实现中,该浏览器假设Javascript只有单线程访问浏览器DOM和其他全局变量/属性。这使得使用它编程的可能性大大降低y可能会导致问题,但会引入一些必须处理的限制

该语言本身完全能够实现多线程,我们已经在WebWorkers和该语言的某些服务器实现中看到了这一点。但是,每当您使用多个线程并尝试读取/写入多个线程之间共享的变量或属性时,必须使用保护设备(如互斥锁)允许可靠地访问这些共享资源。这大大复杂了如何进行这种编程,浏览器中的Javascript决定不需要那种程度的理解才能可靠地编程

对于任何一个已经做过多线程编程的人来说,它可能是强大的,但是引入难以发现的bug是非常非常容易的。那些负责浏览器中Javascript的人决定,应该完全避免这种难度和由此产生的bug类型

即使现在有了WebWorker,WebWorker和主javascript线程之间也没有共享资源。两者必须通过消息传递系统进行通信,这是一种强制安全的简单方法。结果是,无法从WebWorker访问DOM。相反,如果您希望更改DOM,则必须发布将消息发送到单个主线程,并要求它更新DOM。只有在完成其他操作(它是单线程)时,主线程才会收到该消息


DOM现在可能已经花了无数年的时间作为一种仅为单线程访问而设计的结构,因此设计和实现一种从多线程访问它的方法(并修复该实现中产生的所有bug)将是一项艰巨的任务.

JavaScript不是多线程的,但即使设置超时也是同步的。setTimeout和setInterval是由适当JavaScript语言之外的浏览器提供的,后者提供了访问该语言的外部手段,如事件执行。当人们将JavaScript称为异步或多线程语言时s很可能就是他们所指的,因为多个外部访问点(如许多计时器或事件执行)可以同时发生,每个外部访问点都会产生一个到内存中解释器的唯一访问点。这正是Node.js的开发人员在对JavaScript做出此类声明时所指的


这意味着对各种独立线程的多个外部访问可能会导致UI中的冲突,因为模拟的多线程效果可能会导致浏览器输出中的冲突,其中只有一个文档对象代表整个页面。这就是为什么短间隔的setInterval通常被视为不安全的原因。setInterval是完全异步的,即使前一个间隔中的执行尚未结束,它也将根据提供的间隔执行。这种冲突我称之为fallover,因为下一个间隔是执行前一个执行期间的代码,如果您的代码需要访问DOM或使用闭包,您将可能有问题。为了安全起见,建议使用递归setTimeout,因为它是同步的,并且在上一轮执行完成之前不会发生下一轮执行。

Mozilla确实支持Javascript中的多线程-只要您不想从多个线程执行UI工作。早期版本的my Exention是多线程的阅读


请参阅我的扩展部分中关于此问题的内容,或者更好的是关于在Mozilla.eicto中使用工作线程的内容,您可以很好地使用后台线程来实现代码。

eicto,
setTimeout
不会在请求时触发代码
它以内联方式将代码与前面的所有其他代码排成队列,但它将其在队列中的位置设置为至少在请求的时间内

此外,大多数浏览器对最小超时有硬限制。
如果您请求1毫秒的超时,在大多数浏览器中,您很可能会在10毫秒到15毫秒后返回请求

所有JS与DOM的交互,实际上,几乎每一个页面所做的一切,都发生了
<div id="f1">Empty</div>
<div id="f2">Empty</div>

​
var s1 = function() {
    for (i = 1; i < 1000000000; i++) {
        var b = i * i;
    }
    $('#f1').html('Set');
}

var s2 = function() {
    if ($('#f1').html() == 'Empty') {
        $('#f2').html('Multi Thread');
        return;            
    };
    $('#f2').html('One Thread');
}

setTimeout(s2,110);
setTimeout(s1,100);​