js 是同步的语言;执行顺序是冲上往下的
回调函数是异步的。
代码的执行顺序分为:同步 异步
同步 弊端:会发生执行阻塞
异步不会发生阻塞,
异步:未来某一时刻需要执行的代码,优先执行,同步是按照代码的编写顺序从上往下执行,异步不会等待其他代码执行,所有的代码,谁快谁先执行
js中异步
回调函数(ES5) promise对象(ES6) async await (ES7)
回调函数:
优点:异步处理程序
缺点:容易形成毁掉地狱,代码让人看不懂
promise对象解决【回调地狱】问题 弊端:.then .then 链式结构很恶心
推荐: async await 【同步写法异步程序,离不开promise 因为await会后必须是promise对象】
回调函数:一个定义的函数,作为另一个函数的实参传入到另一个函数中
回调函数执行:
自动执行: 针对一些内置的API 自动触发 例如 sort
手动执行: 自定义的函数传入的回调函数需要我们自己 写 xxx() 触发
回调函数学习注意事项
1:将来看到代码,【形参名字()】 ----> 该形参接受实参为【函数】---回调函数
2:注意形参的名字与实参的名字不是一个, 相当于将 实参【函数名】重新赋值给【形参callback】--->形参callback 的值为定义的函数,【等待执行】
3:第一步首先要知道 形参接受的是【哪个函数】--->才能知道执行了哪个回调函数
------> 方式一:通过找到实参,找到形参接受的函数
------> 方式二:通过方法体打印形参,知道接受的是哪个函数;--->知道触发是哪个函数
4:回调函数在执行时候,也可以传入实参,按照上面的顺序,找实参找函数/变量,看至执行
5:不要纠结执行顺序问题,只要会找传入的函数就可以了。
异步学习方法
1: 异步是什么时候开始的?
2: 异步执行完毕时候;是如何告诉外界的
3:外界接收到信号后,做什么
1:当函数作为实参传入时---》决定了【异步程序】
2:异步执行完毕时候;是如何告诉外界的
3:当回调函数方法体代码执行完毕或者有【返回值】时---》异步执行完毕
4:外界只要接受到【返回结果】 或者执行完毕效果---》【外界已经知道异步执行完毕】
5:异步执行完毕后,外界开始处理其他业务
init(fn, a, c, call)
function fn(callback) {
// 执行回调函数 形参名字()
callback() //在这里 call作为
// call() //区别:在执行fn 函数,调用外部函数call
console.log("我是一个函数")
}
function call(callback) {
console.log("我是一个回调函数")
}
function a(callback) {
console.log('111111')
}
var c = function (callback) {
console.log('222222')
}
function init(callback1, callback2, callback3, callback4) {
console.log("初始化")
callback1(a)
callback2()
callback3()
callback4()
console.log(callback4)
}