Javascript是执行时的单个线程。 因此,当有空闲资源时,会执行一段代码。 但是考虑了什么代码?
声明:
var a = null;
一个块
{
a();
b();
c();
}
我想知道在f()
执行结束之前事件发生时是否可能会触发事件回调?
function f(){
a();
b();
asyncDef();
c();
d();
}
在执行f()
之前或在c()
完成之后说出来?
什么时候开门?
答案 0 :(得分:1)
在执行任何异步操作之前,需要完成任何同步代码流。在f()
例子中,f()
需要完全填写,包括调用内部的每个函数。
但是,如果其中一个调用触发异步,则异步代码不会延迟f();
的其余部分,也不会延迟等待的当前异步代码。
答案 1 :(得分:1)
一段代码既是语句又是块。我可以考虑解释它的最佳方式:在浏览器中使用Developer Tools并逐步执行代码。 “一段代码”将是您在某个事件发生时通过的所有代码。
如果javascript在页面上是内联的,它将被解析并作为“一段代码”执行。当事件发生时,回调函数作为一段代码执行。
一旦进入执行环境,一切都会同步发生,并且在该部分完成之前将无法使用开放。例如:
function f () {
var d = new Date().getTime(),
later = d + 5000;
//Execute code as soon as there is an "opening"
setTimeout(function () {
alert("There was an opening.");
}, 0);
//Simulate work being done for 5 seconds.
while (d < later) {
d = new Date().getTime();
}
//implicit return here.
}
f();
您可以看到代码(本例中的函数f)正在使用资源,直到d超过以后的变量。 setTimeout将匿名函数推送到事件队列,并在资源空闲时执行(主要在f完成后)。您可以看到时间约为5秒。
Async JavaScript是一本简短但内容丰富的书,解释了很多这些工作原理。 John Resig's blog也很好地解释了计时器(你可以扩展浏览器事件的想法)。