一直以來都知道JavaScript是一門單線程語言,在筆試過程中不斷的遇到一些輸出結果的問題,考量的是對異步編程掌握情況。一般被問到異步的時候腦子里第一反應就是Ajax,setTimseout...這些東西。在平時做項目過程中,基本大多數操作都是異步的。JavaScript異步都是通過回調形式完成的,開發過程中一直在處理回調,可能不知不覺中自己就已經處在回調地獄中。
瀏覽器線程
在開始之前簡單的說一下瀏覽器的線程,對瀏覽器的作業有個基礎的認識。之前說過JavaScript是單線程作業,但是并不代表瀏覽器就是單線程的。
在JavaScript引擎中負責解析和執行JavaScript代碼的線程只有一個。但是除了這個主進程以外,還有其他很多輔助線程。那么諸如onclick回調,setTimeout,Ajax這些都是怎么實現的呢?即瀏覽器搞了幾個其他線程去輔助JavaScript線程的運行。
瀏覽器有很多線程,例如:
1.GUI渲染線程 - GUI渲染線程處于掛起狀態的,也就是凍結狀態
2.JavaScript引擎線程 - 用于解析JavaScript代碼
3.定時器觸發線程 - 瀏覽器定時計數器并不是 js引擎計數
4.瀏覽器事件線程 - 用于解析BOM渲染等工作
5.http線程 - 主要負責數據請求
6.EventLoop輪詢處理線程 - 事件被觸發時該線程會把事件添加到待處理隊列的隊尾
7.等等等
從上面來看可以得出,瀏覽器其實也做了很多事情,遠遠的沒有想象中的那么簡單,上面這些線程中GUI渲染線程,JavaScript引擎線程,瀏覽器事件線程是瀏覽器的常駐線程。
當瀏覽器開始解析代碼的時候,會根據代碼去分配給不同的輔助線程去作業。
進程
進程是指在操作系統中正在運行的一個應用程序
線程
線程是指進程內獨立執行某個任務的一個單元。線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧)。
進程中包含線程,一個進程中可以有N個進程。我們可以在電腦的任務管理器中查看到正在運行的進程,可以認為一個進程就是在運行一個程序,比如用瀏覽器打開一個網頁,這就是開啟了一個進程。但是比如打開3個瀏覽器,那么就開啟了3個進程。
同步&異步
既然要了解同步異步當然要簡單的說一下同步和異步。說到同步和異步最有發言權的真的就屬Ajax了,為了讓例子更加明顯沒有使用Ajax舉例。(●ˇ∀ˇ●)
同步
同步會逐行執行代碼,會對后續代碼造成阻塞,直至代碼接收到預期的結果之后,才會繼續向下執行。
console.log(1);alert("同步");console.log(2);// 結果:// 1// 同步// 2異步
如果在函數返回的時候,調用者還不能夠得到預期結果,而是將來通過一定的手段得到結果(例如回調函數),這就是異步。
|
新聞熱點
疑難解答
圖片精選