浅谈Javascript线程与定时机制
在Javascript API文档的setTimeout和setInterval的二参数定义为毫秒数,和回调函数执行回调函数执行每毫秒。但随着工作经验的积累,我们发现事实并非如此。
例如
div.onclick =函数(){
setTimeout(){()函数(
document.getelementbyid(输入的)焦点();
},0);
}
很难解释。马上做,你为什么要定一个圆圈的时间呢。
有一天你写了下面的代码
setTimeout(功能)({ } { },(真的),100);
setTimeout(){ alert(hello函数(');},200);
第一行代码死循环,导致第二行警报从未出现,为什么
单线程或多线程
事实证明,Javascript引擎运行在一个线程中,并且在运行Javascript程序的浏览器中只有一个线程,因为单线程设计,它消除了多线程同步的复杂问题。
设置时间时,浏览器将在指定时间内将指定的回调函数插入到任务序列中,而不是立即执行。如果设置时间为0,则意味着立即插入任务序列,而不是立即执行任务序列。您仍然需要等待队列中的任务完成。
下面的代码首先弹出2,然后弹出1。
setTimeout(){()函数(
警报(1);
},0);
警报(2);
那么,这一点的实际用途是什么请看下面的例子
setTimeout 0
输入字符,但内容不能实时显示。
输入字符,内容可以实时显示。
函数显示(瓦尔){
document.getelementsbytagname(div){ 0 } .innerHTML = val;
}
在这个例子中,JS引擎需要执行的KeyDown事件处理程序,然后更新输入框的值。该事件处理程序的执行,更新值的任务只能进入队列,所以keyDown事件不能得到更新后的值;但是通过我们采取价值经营进入队列的setTimeout,和执行中的值更新之后,这样的内容可以实时显示。
回来看看下面的代码:
setTimeout(){()函数(
做某事…
setTimeout(arguments.callee,10);
},10);
setInterval(){()函数(
做某事…
},10);
代码的两部分看起来是一样的,不是吗实际上,还是有区别的。在第一段的回调函数setTimeout设置后的JS引擎执行新的时机。它是假定从上到下一个回调回调,它会在一个时间间隔的开始,理论时间间隔> = 10ms和下一个代码< = 10ms。
在这种情况下,真是XMLHttpRequest异步是的,请求是异步的,但是这个请求是浏览器的一个新线程。如果请求状态被改变了,如果回调已经设置好了,异步线程将把状态变化事件放在js引擎处理队列中等待处理。当任务处理,JS引擎仍将执行函数由onreadystatechange路。
以上是本文的全部内容,希望大家能喜欢。