十五的學習日記20160930-jquery/ajax/JS引擎/job queue

十五的學習日記20160930

JavaScript

  1. jquery源代碼分析
  2. 發起ajax請求的幾個要點
    • 基礎:
      • 前端: 構造頭,構造體,發送包
      • 後端: 判斷來源請求,構造頭,構造體,返回包
    • 同源:
    • 跨域:
      • 1jquery自帶方法
      • 2服務端容許接受跨域設置
      • 3服務器代理
    • 操做:
      • 狀態改變事件監聽.
  3. JS引擎不會單獨運行,他會在一個宿主環境中運行,這個環境對大多數開發者來講就是web瀏覽器.並且在過去的幾年(也不單單是過去幾年),JS超出了瀏覽器到了其餘領域.好比服務器,經過nodejs,實際上近年來JavaScript已經嵌入到了各類設備,從機器人到智能燈泡都有.
  4. 在這全部的環境中,都有一個廣泛的"線程"(這是一個對異步的微妙稱呼),這類"線程"都有一個機制,能在每次調用JS引擎的時候,隨時間執行你的多個語句塊,這個機制就叫作"事件循環".
  5. 換句話說,JS引擎內部沒有感知時間前後的能力,而是一個按需執行任意JS片斷的環境.而安排"事件"(js執行代碼)則老是由JS外部環境來完成.
  6. 舉個例子,當你的JS程序建立了一個Ajax請求,以從服務器獲取一些數據,你設置了"響應"代碼於一個函數中(一般稱爲回調函數),而後JS引擎告訴宿主環境:"嘿哥們兒, 我要暫停一下執行跟你說件事兒,當你不管什麼時候完成了網絡請求,而且得到了一些數據,請務必以調用這個函數返回給我."
  7. 而後瀏覽器就開始監聽網絡響應,當確實得到了一些數據時, 它就會安排一個回調函數放入事件循環中等待調用.
  8. 因此事件循環究竟是什麼?用一段僞代碼來告訴你吧.
// eventloop 是一個扮演棧的數組(先進先出);
var eventloop=[];
var event;
//死循環
while(true){
    //提供一個時刻
    if(eventloop.length>0){
        //獲取下一個棧中的事件
        event=eventloop.shift();
        //執行該事件
        try{
            event();
        }
        catch(err){
            reportError(err);
        }    
    }
    
}
  1. 有一點很重要,就是setTimeout函數不會把你的回調函數放入事件循環, 他會作的是設置一個計時器, 當到達指定時間, 宿主環境就會把你的回調函數放入到事件循環中, 如此一來, 未來的tick纔會把他取出並執行.
  2. ES6的job queue.定義了一種異步的狀況,他老是在當前tick的最後插入語句.
相關文章
相關標籤/搜索