同步跟异步概念:
同步:同步是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下去。
异步:异步是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,当有信息返回的时候会通知进程进行处理,这样就可以提高执行的效率了,即异步是我们发出的一个请求,该请求会在后台自动发出并获取数据,然后对数据进行处理,在此过程中,我们可以继续做其他操作,不管它怎么发出请求,不关心它怎么处理数据。
为什么会出现异步问题?
- 由于JavaScript是一门单线程语言,即同一时间只能做一件事;
- JS本身是同步执行;
- 但在执行耗时操作时为了避免阻塞后续代码的执行,通常采用异步操作;
- 通过事件循环(event loop)实现异步。
异步操作会导致:如果下一个函数需要未执行完成的当前函数中的元素,由于当前函数未对该元素进行处理,而异步使得下一个函数先执行,自然导致下一个函数中获取的该元素为空。辅助代码如下:
<script type="text/javascript">
window.onload=function(){
A();
B();
}
function A(){
setTimeout(function(){
window.data=100;
console.log("A:",window.data)
},3000);
}
function B(){
console.log("B:",window.data);
}
</script>
结果为:
如果不存在异步,即:先执行A(),浏览器等待3s后,对window.data赋值,再输出window.data的值;再执行B()
目前存在异步使得,先执行B(),再执行A()。因为setTimeout中的函数没有立即执行,而是延迟了一段时间,所以可知,A中存在异步任务--》B函数先执行。将A放入任务队列中,等待同步任务和任务队列现有的事件实行完才会执行。