同步模式:就是上面所說的一種執行模式,后一個任務等待前一個任務結束,然后再執行,程序的執行順序與任務的排列順序是一致的、同步的。
異步模式:就是每一個任務有一個或多個回調函數(callback),前一個任務結束后,不是執行后一個任務,而是執行回調函數,后一個任務則是不等前一個任務結束就執行,所以程序的執行順序與任務的排列順序是不一致的、異步的。
回調函數(callback)
異步編程的基本方法。
首先需要聲明,回調函數只是一種實現,並不是異步模式特有的實現。回調函數同樣可以運用到同步(阻塞)的場景下以及其他一些場景。
回調函數的定義:
函數A作為參數(函數引用)傳遞到另一個函數B中,並且這個函數B執行函數A。我們就說函數A叫做回調函數。如果沒有名稱(函數表達式),就叫做匿名回調函數。
生活舉例:約會結束后你送你女朋友回家,離別時,你肯定會說:“到家了給我發條信息,我很擔心你。” 然后你女朋友回家以后還真給你發了條信息。其實這就是一個回調的過程。你留了個參數函數(要求女朋友給你發條信息)給你女朋友,然后你女朋友回家,回家的動作是主函數。她必須先回到家以后,主函數執行完了,再執行傳進去的函數,然后你就收到一條信息了。
//定義主函數,回調函數作為參數
function A(callback) {
callback();
console.log('我是主函數');
}
//定義回調函數
function B(){
setTimeout("console.log('我是回調函數')", 3000);//模仿耗時操作
}
//調用主函數,將函數B傳進去
A(B);
//輸出結果
//我是主函數
//我是回調函數
上面的代碼中,我們先定義了主函數和回調函數,然后再去調用主函數,將回調函數傳進去。
定義主函數的時候,我們讓代碼先去執行callback()回調函數,但輸出結果卻是后輸出回調函數的內容。這就說明了主函數不用等待回調函數執行完,可以接着執行自己的代碼。所以一般回調函數都用在耗時操作上面。比如ajax請求,比如處理文件等。
優點:簡單,容易理解和 部署。
缺點:不利於代碼的閱讀,和維護,各部分之間高度耦合,流程會很混亂,而且每一個任務只能指定一個回調函數。
導圖要表達的內容用文字來表述的話:
同步和異步任務分別進入不同的執行"場所",同步的進入主線程,異步的進入Event Table並注冊函數。
當指定的事情完成時,Event Table會將這個函數移入Event Queue。
主線程內的任務執行完畢為空,會去Event Queue讀取對應的函數,進入主線程執行。
上述過程會不斷重復,也就是常說的Event Loop(事件循環)。
再配上代碼表達:
let data = [];
$.ajax({
url:blog.csdn.net,
data:data,
success:() => {
console.log('發送成功!');
}
})
console.log('代碼執行結束');
上面是一段簡易的ajax請求代碼:
ajax進入Event Table,注冊回調函數success。
執行console.log('代碼執行結束')。
ajax事件完成,回調函數success進入Event Queue。
主線程從Event Queue讀取回調函數success並執行。
相信通過上面的文字和代碼,你已經對js的執行順序有了初步了解
原文鏈接:https://blog.csdn.net/qq_32442973/article/details/119984737