js的异步执行的问题。

最近在js的基础知识,看到js的事件循环机制,产生了几点疑问,希望各位能人不吝赐教。
有这么一句话:(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
栈的特点是先进后出,那么此时所有的同步任务的执行顺序不应该是和我进栈的顺序相反吗?还是说,每次只进栈一个任务?
对于ajax这种异步来说,是不是主线程执行了ajax发出了网络请求,在等待网络请求回复的时候,去执行了其他任务,等到主线程同步任务执行结束了,才回去异步队列里面找到ajax执行他的回调函数?还是说,直接执行后面的所有的同步操作后在开始执行ajax?

阅读 3.1k
2 个回答

楼主你需要再深入了解一下event loop
有一个概念叫做任务队列(task queue),任务队列执行的顺序是先进先出。
那个执行栈,你就想一下你在写代码时经常遇到的嵌套函数(举例子):

function a(){
    console.log('a')
}
function b(){
    a()
}
function c(){
    b()
}
c()

这个时候的进栈顺序就是c->b->a,但是执行完的顺序就是出栈顺序a->b->c。这种情况才是题主说到的执行栈的情况。

对于ajax这种异步来说,当主线程遇到一个ajax请求,会发送请求,将ajax交给浏览器的webapi去执行,然后继续执行后面的代码。
而当浏览器接收到ajax返回数据时,会将回调函数放到任务队列的末端,当正在执行的同步代码全部执行完后,才会去执行该ajax回调。
任务队列严格来说,也有两个不同的来源,分别是microtask和macrotask,他们之间的执行顺序也有区别~
想看更具体的,厚脸皮安利一下自己的博文φ(>ω<*)
通过microtasks和macrotasks看JavaScript异步任务执行顺序

  1. execution context stack 应该说的是执行上下文环境的一个栈吧(里面存储的是函数可访问到的变量啊什么的),主线程上的函数是依次执行的

  2. 对于异步你可以去看看Node的Event Loop应该会得到答案

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题