項目上線了,閒下來就寫寫東西吧。積累了好多東西都沒有作筆記~挑幾個印象深入的記錄一下吧。javascript
js的同步異步以及單線程問題:java
都知道單線程是js的一大特性。可是一般io(ajax獲取服務器數據)、用戶/瀏覽器自執行事件(onclick、onload、onkeyup等等)以及定時器(setTimeout、setInterval)這些異步操做又是怎樣工做的呢。git
咱們把js的任務分爲兩種:同步任務,異步任務:github
舉個例子吧: let a=1;ajax
console.log("同步任務");瀏覽器
setTimeout(()=>{console.log("異步任務1");},0);性能優化
setTimeout(()=>{console.log("異步任務2");},100);服務器
一、其實js會先將全部的同步任務推入到執行棧中;異步
二、執行棧中的任務所有執行完畢;(若是error致使阻塞,那麼將影響到步驟3)性能
三、將異步任務(setTimeout)按時間順序推入任務隊列中;
四、執行異步任務;
ps:很明顯setTimeout和setInterval並非徹底精確。https://github.com/woai30231/javascriptThreadStudy(javascript線程及與線程有關的性能優化)
js console.log同步異步?:這個問題是在調試的時候遇到的,我發現有時候console.log並不會給我預期的結果,後來查查資料(參考《你不知道的javascript中卷》第二部分異步和性能 1.1 異步控制檯部分)。
並無什麼規範或一組需求指定console.* 方法族如何工做——它們並非JavaScript 正式的一部分,而是由宿主環境(請參考本書的「類型和語法」部分)添加到JavaScript 中的。所以,不一樣的瀏覽器
和JavaScript 環境能夠按照本身的意願來實現,有時候這會引發混淆。尤爲要提出的是,在某些條件下,某些瀏覽器的console.log(..) 並不會把傳入的內容當即輸出。出現這種狀況的主要緣由是,在許
多程序(不僅是JavaScript)中,I/O 是很是低速的阻塞部分。因此,(從頁面/UI 的角度來講)瀏覽器在後臺異步處理控制檯I/O 可以提升性能,這時用戶甚至可能根本意識不到其發生。
什麼意思呢?咱們仍是舉個例子來講: var a={name:"小Q"};
console.log(a);
a.name="snail";
咱們一般認爲剛好在執行到console.log(..) 語句的時候會看到a 對象的快照,大多數狀況下咱們看到的是"小Q」,可是,有時候瀏覽器可能會吧控制檯I/O延遲到後臺,這時候咱們看到的多是"snail",到底什麼
時候控制檯I/O 會延遲,甚至是否可以被觀察到,這都是遊移不定的。若是在調試的過程當中遇到對象在console.log(..) 語句以後被修改,可你卻看到了意料以外的結果,要意識到這多是這種I/O 的異步化形成的。
若是遇到這種少見的狀況,最好的選擇是在JavaScript 調試器中使用斷點,而不要依賴控制檯輸出。次優的方案是把對象序列化到一個字符串中,以強制執行一次「快照」,好比經過JSON.stringify(..)。