同步
- 如果能直接拿到结果那就是同步
比如你在医院挂号,你拿到号才会离开窗口
同步任务可能消耗十毫秒 也可能需要三秒
总之不拿到结果你是不可能离开的
异步
- 如果不能直接拿到结果那就是异步
比如你在餐厅门口等位,你拿到号可以去逛街
什么时候才能真正吃饭呢
你可以每十分钟去餐厅问一下(轮询) 你也可以扫码用微信接受通知(回调) - 举例
异步举例
以AJAX为例
request.send()之后,并不能直接得到response
不信console.log(request.response)试试
必须等到readyState变为4后,浏览器回头调用request.onreadystatechange函数
我们才能得到request.response
这跟餐厅给你发送微信提醒的过程是类似的
回调callback
- 写了却不调用 给别人调用的函数 就是回调
你写给自己用的函数不是回调
你写给别人用的函数就是回调
request.onreadystatechange就是我写给浏览器调用的
意思就是你(浏览器)回头调用一下
在中文里 回头 也有 将来的意思 如 我回头请你吃饭 - 举例
把函数1给另一个函数2
**
function f1(){}
funciton f2(fn){
fn()
}
f2(f1)
- 分析:
我调用了f1吗 答:没有调用
我把f1传给f2(别人)了吗 答 传了
f2调用f1了吗 答:f2调用了f1
那么 f1是不是我写给f2的调用函数 答 是
所以 f1是回调
异步和回调的关系
- 关联
异步任务需要在得到结果时通知JS来拿结果
怎么通知呢?
可以让JS留一个函数地址(电话号码)给浏览器
异步任务完成时浏览器调用该函数地址即可(拨打电话)
同时把结果作为参数传递给该函数(电话里说可以来吃饭了)
这个函数是我写给浏览器调用的 所以是回调函数 - 区别
异步任务需要用到回调函数来通知结果 也可以用轮询
但回调函数不一定只用在异步任务里
回调可以用到同步任务里
array.forEach(n=)console。log(n))就是同步回调