JavaScript語言的執行環境是單線程的,便是一次只能完成一個任務,其餘任務排隊等候執行。只有當前一個任務完成時,才能開始進行下一個任務。編程
這種模式的執行環境簡單,如果遇到一個耗時較長的任務,將會拖延整個程序的執行。異步
爲了解決這個問題,咱們有同步和異步兩種任務的執行模式:異步編程
同步模式即上述所說的單線程模式; 異步模式:每一個任務都有回調函數(callback), 前一個任務結束後,不是執行後一個任務,而是執行回調函數, 後一個任務則是不等前一個任務結束就執行, 因此程序的執行順序與任務的排列順序是不一致的、異步的。
小劇場:函數
顧客1(打電話): 老闆,我要買本小黃書,你有嗎? 老闆: 我找找,一下子給你回電話。( 老闆幹其餘事情。) 顧客2(打電話): 老闆,我要買本紅包書,你有嗎? 老闆: 我找找,一下子給你回電話。( 老闆幹其餘事情。) ………… 找到書,老闆回電話。
劇場說明線程
其中回電話就是咱們的回調函數,而找書就是任務。 異步: 找到書(前一個任務完成)就回電話(執行回調函數), 然後一個任務(找書)無論前一個任務是否完成都會開始。 同步: 老闆接了電話就開始找書(保持通話狀態), 直到書找到知足顧客1的需求, 顧客2的電話才能打得進來。
回調函數:
回調函數是實現異步編程的最基本的方法。咱們假設有兩個函數f1()和f2(),f1()執行完成後才能執行f2():code
f1(); f2();
假設f1()是一個很耗時的任務,那麼咱們能夠考慮異步機制,改寫f1(),將f2改寫爲f1()的回調函數:ip
function f1 (callback) { setTimeout(function () { callback()},1000); } f1(f2);
採用這種方式,咱們把同步操做變成了異步操做,f1不會堵塞程序的運行,也就是說咱們先執行程序的主要邏輯,將耗時的操做推遲執行。回調函數
歡迎討論和指出不足^_^同步