同步回調(diào)的例子:
function highOrderFunc(callback){
callback();
}
setTimeout(function(){
alert(1); //后執(zhí)行
},0);
highOrderFunc(function(){
alert(2); //先執(zhí)行
});
結(jié)果:2 1
異步回調(diào)的例子:
function asyncTask(success){
sendAjax({
url:'/',
success:success
});
}
setTimeout(function(){
alert(1); //先執(zhí)行
},0);
asyncTask(function(){
alert(2); //后執(zhí)行
});
結(jié)果:1 2
之所以有這樣的差異,是因為瀏覽器對同步回調(diào)和異步回調(diào)的實現(xiàn)方式不同。
瀏覽器對同步回調(diào)的實現(xiàn)方式是單線程的,拿到參數(shù)函數(shù)以及它的詞法環(huán)境,直接調(diào)用即可。
而對于異步回調(diào),需要另起一個線程,讓函數(shù)先返回。當異步任務(wù)執(zhí)行完后,再把事件放到任務(wù)隊列中,依賴事件循環(huán)機制來觸發(fā)。