javascript Event loop

感谢Philip Roberts的演讲Help, I'm stuck in an event-loop让我对javascript的运行机制有一定的理解。

javascript是一种单线程语言,所以任务(代码段)只能依次执行。当某一段代码执行IO任务时,CPU是空闲的,执行IO任务也不可能是当前线程,所以当前线程只有等执行IO任务的线程执行完毕,给当前线程发送消息,才能继续执行后面的代码,这样显然是没有必要的。我们完全可以继续执行其它需要CPU进行计算的任务,把需要其它设备执行并等待执行结果的任务暂时搁置,等其它线程对当前进程发送消息表示任务执行完毕之后,再考虑执行这些任务。

javascript的运行机制可以通过以下一张图来说明:

javascript Event loop

javascript的任务可以分为同步任务,异步任务两种。所有同步任务都在主线程上执行,形成一个执行栈(execution context stack);所有的异步任务最开始都以消息的形式存在于callback 的队列当中。代码的执行顺序如下:

1.js解释器将首先执行所有的同步任务,如果有其它线程触发异步任务的消息到来,将该消息保存在callback队列里面,将其搁置。

2.同步任务执行完之后,将callback里面的消息所绑定的任务放到执行栈里面执行。

3.callback queue不断的接受消息,当执行栈为空的时候把队首的消息绑定的任务放到执行栈执行。

以上机制可以说明一些问题:

1.因为callback里面的消息都是其它线程发送的,而这些消息都是操作系统发出的,所以用户很难自定义消息来绑定一个异步任务,也就是异步任务的数量有限,我们不能增加,我们能增加的只是该与消息绑定的回调函数。

2.很多时候用户没有太大必要定义匿名回调函数。

3.可以通过封装已有异步任务的方式自定义适合自己的方法。