異步
我們都知道Javascript語言的執(zhí)行環(huán)境是"單線程"凸主,所謂"單線程"就是指一次只能完成一件任務(wù)橘券。如果有多個任務(wù),就必須排隊(duì),前面一個任務(wù)完成旁舰,再執(zhí)行后面一個任務(wù)锋华,以此類推。
這種模式的好處是實(shí)現(xiàn)起來比較簡單箭窜,執(zhí)行環(huán)境相對單純毯焕;壞處是只要有一個任務(wù)耗時很長,后面的任務(wù)都必須排隊(duì)等著磺樱,會拖延整個程序的執(zhí)行纳猫。
為了解決這個問題,Javascript語言將任務(wù)的執(zhí)行模式分成兩種:同步和異步竹捉。
所謂"異步"芜辕,簡單說就是一個任務(wù)分成兩段,先執(zhí)行第一段块差,然后轉(zhuǎn)而執(zhí)行其他任務(wù)物遇,當(dāng)?shù)谝欢斡辛藞?zhí)行結(jié)果之后,再回過頭執(zhí)行第二段憾儒。
console.log(1);
setTimeout(function () {
console.log(2);
});
console.log(3);
回調(diào) (callback)
在JavaScript中询兴,回調(diào)函數(shù)具體的定義為:函數(shù)A作為參數(shù)(函數(shù)引用)傳遞到另一個函數(shù)B中,并且這個函數(shù)B執(zhí)行函數(shù)A起趾。我們就說函數(shù)A叫做回調(diào)函數(shù)诗舰。如果沒有名稱(函數(shù)表達(dá)式),就叫做匿名回調(diào)函數(shù)训裆。
回調(diào)函數(shù)
function add(num1, num2, callback){
var sum = num1 + num2;
callback(sum);
}
function print(num){
console.log(num);
}
add(1, 2, print); //=>3
匿名回調(diào)函數(shù)
function add(num1, num2, callback){
var sum = num1 + num2;
callback(sum);
}
add(1, 2, function(sum){
console.log(sum); //=>3
});
回調(diào)函數(shù)的優(yōu)點(diǎn)和使用場景
優(yōu)點(diǎn)
1.DRY眶根,避免重復(fù)代碼。
2.可以將通用的邏輯抽象边琉。
3.加強(qiáng)代碼可維護(hù)性属百。
4.加強(qiáng)代碼可讀性。
5.分離專職的函數(shù)变姨。
使用場景
1.異步編程族扰。
2.事件監(jiān)聽、處理定欧。
3.setTimeout渔呵、setInterval方法。
4.通用功能砍鸠,簡化邏輯扩氢。
參考http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
https://www.cnblogs.com/starof/p/6888178.html