javascript异步的一些理解
最近最javascript的异步有一些认识,分享给各位同道~
首先来一句概括的总论:在javascript中,除了首次执行的js属于同步代码是同步之外,其他的一切都是异步的。
一个最最基础的事实:浏览器是多进程的,每个页面就是一个进程,每个进程包括许多的线程如 JavaScript 引擎线程,GUI线程,事件触发线程,http请求线程,时间轮询线程,js解释器是单线程的。JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序,这意味这页面上的所有代码都可以公用全局上下文。
说到线程,那就不得不说说进程。在知乎上面有一篇关于进程和线程的区别的帖子写的非常不错,有一句话很基础也让人印象深刻 --- 进程和线程都是一个时间段的描述,是CPU工作时间段的描述。(这里引用一下,有兴趣的可以去了解解一下)。
javascript是单线程的,相信你从接触这个javascript开始就接受了这个概念,但是单有这个概念你是很难去理解javascript 的异步的,甚至会有一些疑惑,既然js 是单线程的?那么为什么可以去计时,为什么可以去做ajax请求,webworker等概念都会让你觉得why?js不是单线程的吗?这些是怎么实现的?
javascript异步的实现:本质上还是借助于多线程的宿主实现的,并发 Javascript 语言本身特性。其背后实现具体依靠事件循环。如果你有linux 的学习经验的话,你可以把它想象成js的解析类比成管道,js在介绍的时候总是从管道的后端加入一些信息,这些信息包括作用域,变量等。在解析执行就是在这个管道中进行。完成之后就自动会进行下一个等待的task(如果有任务在等待执行的话)。这些个task从何而来?因为浏览是多线程的,有些线程会去协调其他线程比如js线程,事件触发线程,定时线程。这些线程会把事件触发线程的触发的事件推给js线程进行js的task。
明白这些我们能实现什么呢?下面举个例子
在 javascript我们通过某个事件的回调去给兼听window的事件去处理某些需求,比如说scroll事件,同时有需求需要在一定的滚动距离内实现某些状态的更改和调用的scrollTo dom api。在调用scrollTo的api中,我们会触发一次scroll事件。。。
欢迎交流,指正~