尽管你可能使用javascript 很多年了,但是你知道javascript 在浏览器中是如何工作的吗?
参考附图,请注意,图形中的大多数内容都不是javascript语言本身的一部分。web api、callback queue(回调队列)和event loop(事件循环)都是浏览器提供的功能。javascript 在node.js中运行的情况类似。
为什么javascript是一种非阻塞的单线程语言?
javascript 一次只能做一件事,因为它只有一个调用栈(call stack)。调用栈是javascript 解释器跟踪函数调用的机制。每次脚本或函数调用另一个函数时,它都会被添加到调用栈的顶部。每次函数退出时,解释器都会将其从调用栈中移除。
javascript只有一个调用栈,这就是为什么它一次只能做一件事。
javascript堆(heap)是我们定义函数或变量时存储对象的地方。
虽然这对于javascript语言本身是正确的,但我们仍然可以在浏览器中并发执行操作,这是通过浏览器提供的web api 实现。
为了应对javascript 单线程机制,web浏览器为我们提供了可以在javascript代码中调用的api。然而,执行是由平台本身处理的,这就是它不会阻塞调用栈的原因。
web api 的另一个优点是它们是用底层代码(如c语言)编写的,这允许它们做一些在纯javascript中不可能做的事情。
这样,就可以在javascript 中进行ajax请求或操作dom,以及其它一些事情,如地理跟踪、访问local storage、service workers等等。