先舉個例子
var n=0
function doSomething(){
console.log('開始')
var id=setInterval(()=>{
n++
console.log('在interval內(nèi)循環(huán)')
if(n>=10){
window.clearInterval(id)
console.log('interval循環(huán)完畢')
}
},1)
}
function doNext(){
console.log('執(zhí)行下一條')
}
doSomething()
doNext()
- 這里引出一個疑問:
明明doNext()在doSomething()之后,但是doNext()內(nèi)的console.log(執(zhí)行下一條)確執(zhí)行在(開始)之后.
這是為什么呢?---是因為setInterval觸發(fā)了JS中的異步執(zhí)行順序.它讓doSomething()里的內(nèi)容還沒做完,就開始執(zhí)行doNext()了. - 這里都doNext()并不知道doSomething()執(zhí)行完沒有.所以引出了js中的另一個知識點--回調(diào)函數(shù).
將上述代碼修改為:
var n=0
function doSomething(fn){// 傳入另一個函數(shù)
console.log('開始')
var id=setInterval(()=>{
n++
console.log('在interval內(nèi)循環(huán)')
if(n>=10){
window.clearInterval(id)
console.log('interval循環(huán)完畢')
fn.call() //也可fn(),結(jié)束時再調(diào)用傳入的函數(shù)
}
},1)
}
function doNext(){
console.log('執(zhí)行下一條')
}
doSomething(doNext)//將doNext作為參數(shù)傳入
這樣就能通過回調(diào)函數(shù)(callback)來讓告訴doNext(),doSomething()已經(jīng)執(zhí)行完了.
打個比方,下面的A就是同步,而B不包括括號內(nèi)的部分就是異步,括號內(nèi)的內(nèi)容就是回調(diào)
- 總結(jié):
- js中的異步就是不等結(jié)果就執(zhí)行下一步.
- js中的回調(diào)函數(shù)就是拿到結(jié)果(通常是異步結(jié)果)
其它待補充