执行开始时

时间:2013-12-20 18:56:04

标签: javascript

Javascript是执行时的单个线程。 因此,当有空闲资源时,会执行一段代码。 但是考虑了什么代码?

声明:

var a = null;

一个块

{
   a();
   b();
   c();
}

我想知道在f()执行结束之前事件发生时是否可能会触发事件回调?

function f(){
   a();
   b();
   asyncDef();
   c();
   d();
}

在执行f()之前或在c()完成之后说出来? 什么时候开门?

2 个答案:

答案 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也很好地解释了计时器(你可以扩展浏览器事件的想法)。