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