js的异步执行的问题。
最近在js的基础知识,看到js的事件循环机制,产生了几点疑问,希望各位能人不吝赐教。
有这么一句话:(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
栈的特点是先进后出,那么此时所有的同步任务的执行顺序不应该是和我进栈的顺序相反吗?还是说,每次只进栈一个任务?
对于ajax这种异步来说,是不是主线程执行了ajax发出了网络请求,在等待网络请求回复的时候,去执行了其他任务,等到主线程同步任务执行结束了,才回去异步队列里面找到ajax执行他的回调函数?还是说,直接执行后面的所有的同步操作后在开始执行ajax?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
楼主你需要再深入了解一下event loop
有一个概念叫做任务队列(task queue),任务队列执行的顺序是先进先出。
那个执行栈,你就想一下你在写代码时经常遇到的嵌套函数(举例子):
这个时候的进栈顺序就是c->b->a,但是执行完的顺序就是出栈顺序a->b->c。这种情况才是题主说到的执行栈的情况。
对于ajax这种异步来说,当主线程遇到一个ajax请求,会发送请求,将ajax交给浏览器的webapi去执行,然后继续执行后面的代码。
而当浏览器接收到ajax返回数据时,会将回调函数放到任务队列的末端,当正在执行的同步代码全部执行完后,才会去执行该ajax回调。
任务队列严格来说,也有两个不同的来源,分别是microtask和macrotask,他们之间的执行顺序也有区别~
想看更具体的,厚脸皮安利一下自己的博文φ(>ω<*)
通过microtasks和macrotasks看JavaScript异步任务执行顺序
execution context stack 应该说的是执行上下文环境的一个栈吧(里面存储的是函数可访问到的变量啊什么的),主线程上的函数是依次执行的
对于异步你可以去看看Node的Event Loop应该会得到答案