一、异步是什么?同步是什么?
1、如果能够直接拿到结果的情况,就是同步
2、如果不能直接拿到结果,那就是异步
二、回调(callback)
你写给自己使用的函数,不是回调
你写给别人使用的函数,就是回调
举例:
function f1(){}
function f2(fn){
fn()
}
f2(f1)
分析:
我自己有没有调用 f1? 答:没有
我把 f1 传别人(f2)了没有? 答:传了
f2 调用了 f1 没有? 答: f2 调用了 f1
那么, f1 是不是我写给 f2 调用的函数呢? 答:是
所以,f1 就是回调
抬杠:
1、如果 f2 它不调用 f1 呢? 答:那你写这个 fn 的参数是吃饱了撑的吗?
2、如果我给 f2 传的参数不是一个函数呢? 答:会报错
三、回调和异步的关系和区别
(1)它们是关联关系
异步任务需要在得到结果时通知JS来拿结果
它提前让JS留一个函数地址给浏览器
异步任务完成时浏览器调用该函数地址即可
同时把结果作为参数传给这个函数
而这个函数就是我写给浏览器调用的,所以就是回调函数
(2)它们的区别
异步任务需要用到回调函数来通知结果
但是回调函数不一定只用在异步任务里面
它也可以用在同步任务中,如:
array.forEach(n => console.log(n))
就是一个同步回调
四、如何判断同步和异步
如果一个函数的返回值处于:
setTimeout
AJAX(即:XMLHttpRequest)
AddEventListener
这三个东西内部的话,那么这个函数就是异步函数(当然以后还会有,现在先记住这三个)
补充:AJAX的确可以设置为同步的,但是千万别设置,因为这样会让请求期间,页面卡主什么都做不了
网友评论