https://www.cnblogs.com/dolphinX/p/3452684.html
虽然在JavaScript中有setInterval和setTimeout函数使javaScript看起来好像使多线程执行,单实际上JavaScript使单线程的,一次只能做一件事情.详见上面网址。
Web Workers
在html5规范中引入了web workers概念,解决客户端JavaScript无法多线程的问题,其定义的worker是指代码的并行线程,不过web worker处于一个自包含的环境中,无法访问主线程的window对象和document对象,和主线程通信只能通过异步消息传递机制。(《JavaScript权威指南》)
可单线程的客户端JavaScript也能响应DOM事件,还有大家都很熟悉的ajax操作,回调函数也是异步的,既然客户端JavaScript是单线程执行的,回调函数是谁调用的呢?答案很简单,JavaScript的宿主环境——浏览器,也就是说虽然JavaScript是单线程执行的,但浏览器是多线程的,负责调度管理JavaScript代码,让它们在恰当的时机执行。
所以我们所说的node.js单线程,是指node.js并没有给我们创建一个线程的能力,所有我们自己写的代码都是单线程执行的,在同一时间内,只能执行我们写的一句代码。但宿主环境node.js并不是单线程的,它会维护一个执行队列,循环检测,调度JavaScript线程来执行。因此单线程执行和并发操作并不冲突。