最近最javascript的異步有一些認識,分享給各位同道~javascript
首先來一句歸納的總論:在javascript中,除了首次執行的js屬於同步代碼是同步以外,其餘的一切都是異步的。java
一個最最基礎的事實:瀏覽器是多進程的,每一個頁面就是一個進程,每一個進程包括許多的線程如 JavaScript 引擎線程,GUI線程,事件觸發線程,http請求線程,時間輪詢線程,js解釋器是單線程的。JavaScript引擎是單線程運行的,瀏覽器不管在何時都只且只有一個線程在運行JavaScript程序,這意味這頁面上的全部代碼均可以公用全局上下文。linux
說到線程,那就不得不說說進程。在知乎上面有一篇關於進程和線程的區別的帖子寫的很是不錯,有一句話很基礎也讓人印象深入 --- 進程和線程都是一個時間段的描述,是CPU工做時間段的描述。(這裏引用一下,有興趣的能夠去了解解一下)。git
javascript是單線程的,相信你從接觸這個javascript開始就接受了這個概念,可是單有這個概念你是很難去理解javascript 的異步的,甚至會有一些疑惑,既然js 是單線程的?那麼爲何能夠去計時,爲何能夠去作ajax請求,webworker等概念都會讓你以爲why?js不是單線程的嗎?這些是怎麼實現的?github
javascript異步的實現:本質上仍是藉助於多線程的宿主實現的,併發 Javascript 語言自己特性。其背後實現具體依靠事件循環。若是你有linux 的學習經驗的話,你能夠把它想象成js的解析類比成管道,js在介紹的時候老是從管道的後端加入一些信息,這些信息包括做用域,變量等。在解析執行就是在這個管道中進行。完成以後就自動會進行下一個等待的task(若是有任務在等待執行的話)。這些個task從何而來?由於瀏覽是多線程的,有些線程會去協調其餘線程好比js線程,事件觸發線程,定時線程。這些線程會把事件觸發線程的觸發的事件推給js線程進行js的task。web
明白這些咱們能實現什麼呢?下面舉個例子ajax
在 javascript咱們經過某個事件的回調去給兼聽window的事件去處理某些需求,好比說scroll事件,同時有需求須要在必定的滾動距離內實現某些狀態的更改和調用的scrollTo dom api。在調用scrollTo的api中,咱們會觸發一次scroll事件。。。
後端
歡迎交流,指正~api