回调函数
js 是同步的语言;执行顺序是冲上往下的
回调函数是异步的
代码的执行顺序分为:同步 异步
同步 弊端:会发生执行阻塞
异步不会发生阻塞
异步:未来某一时刻需要执行的代码,优先执行,同步是按照代码的编写顺序从上往下执行,
异步不会等待其他代码执行,所有的代码,谁快谁先执行
js中异步:
回调函数(ES5) promise对象(ES6) async await (ES7)
回调函数:
一个定义的函数,作为另一个函数的实参传入到另一个函数中
回调函数执行:
* 自动执行: 针对一些内置的API 自动触发 例如 sort
* 手动执行: 自定义的函数传入的回调函数需要我们自己 写 xxx() 触发
优点: 异步处理程序
缺点: 容易形成毁掉地狱,代码让人看不懂
promise对象解决【回调地狱】问题 :
弊端:.then .then 链式结构很麻烦
推荐: async await 【同步写法异步程序,离不开promise 因为await会后必须是promise对象】
回调函数执行步骤:
*1:当函数作为实参传入是---->决定了【异步程序】
* 2:当回到函数执行时候------> 【异步开始了】
* 3:当回调函数方法体代码执行完毕或者有【返回值】时 ----> 异步执行完毕
* 4:外界只要接收到【返回结果】 或者执行完毕效果 ----->【外界已经知道异步执行完毕】
* 5:异步执行完毕后,外界开始处理其他业务
eg: fn(call) //将 call 函数以实参的形式传入 fn 函数中
function fn(callback) { // callback = call()
callback(call2) // 执行 call() 函数,并把 call2() 函数以实参的形式传入 call() 函数中
console.log('我是一个函数')
}
function call(callback) { // callback = call2()
callback() // 执行 call2() 函数
console.log('我是一个回调函数')
}
function call2(){
console.log('我是第二次对调函数')
}
执行顺序:call2() ——> call() ——> fn()