写在最前面:我没有系统学习过node,也没有真正阅读过V8的源码,这些只是在我现有知识的一些理解,如果有错误,希望你能给我留言,谢谢!:)
V8是众多JavaScript引擎中的一个,单线程,一次只能做一件事。
Node中嵌入了V8,因为由V8之外的代码,V8能处理多个任务。
引擎,是用来执行任务的一个工具,一个程序,说白了就是一段代码。
V8是一个用C++编写的程序,它能处理JavaScript代码,把他翻译成机器语言,让他们能被执行。
机器语言,就是机器说的话,我们说的(写的代码)是高级语言,机器要听懂我们的话必须将我们说的话翻译一遍。
不同国家的人说不同的话,机器(微型处理器)也是这样,ARM、x86、IA-32、MIPS......V8的强大之处在于可以将JS代码翻译成不同的机器语言,实现了“跨平台”。
无论时在浏览器还是服务器,V8都是只一部分,其他与V8配合的c++代码,赋予浏览器/服务器更多功能。
浏览器中:操控dom、发送HTTP请求...
V8的能力是局限的,它处理JS代码,只能做到单线程,或者说同步,或者说,一次只能读一行。但这在实际应用时当然是不行的。
为什么?举个例子。我打开一个网页,10秒中过去了,页面还是白的,我不想等了,点右上角的×。如果浏览器中所有的事情是同步的,这时候就没反应,网页关不掉,我看不到东西,也干不了别的。因为这时候浏览器在帮我到服务器上取数据了,数据还没取完,关闭浏览器就不能被执行。“取数据”、“关闭浏览器”这两个必须是一个个被执行,一个做完了,才轮到下一个。
所以浏览器是有分工的,取数据这种耗时操作,不是由V8来完成的(给了HTTP Request),浏览器中还有别人,来分担这些任务。这样一个浏览器用起来,才会觉得是流畅的。

在Node中更是这样,服务器需要进行对文件的操作,这些操作都是耗时的。Node除了V8之外,还有自己的核心代码,处理耗时的任务,为V8分担。这些核心代码同样是用C++编写的。

所以JavaScript有“异步函数”的概念,或者说能处理异步的任务,并不是JSE自己在同时做多件事情,而是和别人配合,完成多件事情。