异步
定义
异步就是不可以直接拿到结果,要通过别的方法拿到,包括两个方法,轮询和回调
Tips:
- 如果 JS 不能直接拿到一个函数的结果,可以先去执行别的代码,等结果到了再取结果,这就是异步
- 异步的结果可以通过轮询获取,轮询就是定时去询问结果拿到了没有
- 异步的结果可以通过回调获取,一般来说结果会被作为回调的第一个参数
- 异步的好处是可以把用来等待的时间拿去做别的事情
异步函数特征
其返回值为
- setTimeOut
- Ajax
- AddEventListener
这三种多为异步函数
虽然Ajax可以用同步来调用,但这是傻x行为,这样调用会导致网页很卡······
异步调用的方法
轮询
就是每过一定的时间去问一次
回调
通过别的东西通知你
通过回调使异步拿到结果的过程
- 由于不能直接拿到结果,所以要先传一个回调给异步任务。
- 在异步任务完成的时候调用回调。
- 调用的时候把结果作为参数,从而调用
认真分析回调
被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数。回调函数就是写给别人用的函数,是写个浏览器回头调用的,调用的时机是等到浏览器的ready state=4,也就是读取服务器相应完了才会用的。要注意写给别人的才是回调,写给自己的不是回调
eg:
let f1=()=>{}
let f2=(fn)=>{fn()}
f2(f1)
此时fq的地址就作为fw中的一个参数被调用,所以fq就是一个回调函数。
直接调用的f2则不是回调函数。若是这样
let f1=()=>{}
let f2=(fn)=>{}
f2(f1)
虽然此时f2里面没有写怎么调用f1,但f2接受了f1这个参数肯定是要用的,所以此时f1仍然是回调,此时f2对于f1的调用方法就是不管他,让他自生自灭,这也算是调用了。
eg2
let a = 1
function f1(){
(function (){var a = 2})()
console.log(a)//1
}
f1()
其实它仍旧是最普通的函数调用,f1.call(undefined),this指向window,打印出的是全局的a。
借此,我们终于可以解释为什么setTimeout总是丢失this了,因为它也就是一个回调函数而已。回调函数就是会自动指向window而非当前对象,这也被称为回调函数的this丢失。
回调的Tips
- 回调可以用于同步任务,不一定非要用于异步任务
- 有的时候回调还可以传给一个对象,如 request.onreadystatechange,等待浏览器来调用
异步函数特征
同步
一定要直接拿到结果,不然就不走
网友评论