【总结】javascript中的同步与异步

概念

同步模式

简单的理解就是后一个任务等待前一个任务的结束才能执行,程序的执行顺序与任务的排列顺序是一致的、同步的;同步任务进入主线程

异步模式

异步的每一个任务有一个或多个回调函数,前一个任务执行结束后,并不会执行后一个任务,而是执行它的回调函数。而后一个任务不会等待前一个任务结束才执行,所以程序的执行顺序与任务的排列顺序是不一致的,异步的;

javascript中的同步与异步

同步

javascript是单线程语言,浏览器中负责解释和执行javascript只有一个线程(主线程),即在同一时刻,同一个javascript引擎只能执行一个任务。在程序运行时,所有的任务都在javascript的主线程上等待执行。当一个任务被执行时,它就会被推入调用栈,执行完毕后,又被推出调用栈

执行上下文

执行上下文指的是执行javascript代码的环境,只要有代码在javascript中运行,它就一定在执行上下文中运行。函数的代码在函数的执行上下文内执行,而全局环境的代码则在全局执行环境上下文内执行,而且每个函数都会创建属于自己的执行上下文

调用栈

调用栈是一个栈,是一种数据结构。它的作用就是存储代码运行时的上下文

异步

javascript中常见的异步执行

  • 回调函数
  • Promise
  • 事件委托

事件循环和消息队列

执行javascript的只有主线程,但浏览器的渲染进行是提供多个进程的,他们都属于Web Api的范畴,如下:

  • 事件处理线程(DOM Events)
  • 定时触发线程(setTimeout)
  • 异步http请求线程(Fetch Api)
  • GUI线程
    注意:javascript的全局执行上下文是javascript引擎的一部分,而Web Api不是,它会创建一个单独的执行上下文,且不在javascript中

javascript的异步运行机制

javascript处理异步任务的机制是:遇到耗时操作(web Api的方法)就将其耗时代码放入web Api的执行上下文栈中运行,运行结束后,将其中包含的回调函数立即放入消息队列中;消息队列会将其中按顺序存放的回调函数,按顺序推入主线程所在的调用栈中执行

注意:消息队列并不是一收到回调函数就立即放入主线程执行,而是会先检查主线程上是否有别的任务在执行,如果有就等待主线程处理完了再推入回调函数。其事件循环机制就是循环地去检查主线程是否空闲,一旦空闲就将回调函数放入其中执行

你可能感兴趣的:(javascript)