zoukankan      html  css  js  c++  java
  • js执行机制

    1.同步和异步的区别

    • 同步:任务排队,上一个任务执行完毕,再执行下一个任务
    • 异步:执行上一个任务的同时,执行下一个任务

    2.js中的任务

    • 同步任务:在主线程上排列执行的任务,上一个任务执行完毕,才能执行下一个任务
    • 异步任务:不进入主线程,而是进入任务队列的任务。当主线程中的任务执行完毕,才会从任务队列中读取异步任务,并放入主线程执行。

    3.js执行机制概述

    JavaScript是单线程执行的,当页面加载时,会判断任务是同步任务还是异步任务。如果是同步任务,就放入主线程执行,如果是异步任务,进入Event Table并注册事件,当满足触发条件后,(触发条件可能是延时也可能是ajax回调),将事件按依次推入Event Queue中等待读取。一旦执行栈中的同步任务执行完毕,主线程就会读取Event Queue中的事件,与事件对应的异步任务结束等待状态,进入主线程执行。

    4.执行栈和任务队列:

    JavaScript 在执行时,同步任务会排好队,在主线程上按照顺序执行,前面的执行完了再执行后面的,排队的地方叫执行栈(execution context stack)。

    JavaScript 对异步任务不会停下来等待,而是将其挂起,继续执行执行栈中的同步任务,当异步任务有返回结果时,异步任务会加入与执行栈不一样的队列,即任务队列(task queue),所以任务队列中存放的是异步任务执行完成后的结果,通常是回调函数。

    • "任务队列"是一个事件的队列(也可以理解成消息的队列),IO设备完成一项任务,就在"任务队列"中添加一个事件,表示相关的异步任务可以进入"执行栈"了。主线程读取"任务队列",就是读取里面有哪些事件。
    • "任务队列"中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等)。只要指定过回调函数,这些事件发生时就会进入"任务队列",等待主线程读取。
    • 所谓"回调函数"(callback),就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。
    • "任务队列"是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本上是自动的,只要执行栈一清空,"任务队列"上第一位的事件就自动进入主线程。但是,由于存在后文提到的"定时器"功能,主线程首先要检查一下执行时间,某些事件只有到了规定的时间,才能返回主线程。

    5.js执行机制(事件循环)

    1. 所有同步任务都在主线程上执行,形成一个执行栈,先执行执行栈中的同步任务,
    2. 主线程之外,还存在一个"任务队列"。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
    3. 执行栈中的同步任务执行完毕,主线程就会去读取"任务队列",依次执行那些事件所对应的异步任务。
    4. 以上过程不断重复形成事件循环,就是js的运行机制
  • 相关阅读:
    语音识别六十年
    神经网络架构PYTORCH-几个概念
    Ubuntu 16.04 系统无法挂载u盘的问题
    技术的止境
    神经网络架构PYTORCH-宏观分析
    Python中parameters与argument区别
    神经网络架构PYTORCH-初相识(3W)
    【ES】学习9-聚合2
    【ES】学习8-聚合1
    【python】中文提取,判断,分词
  • 原文地址:https://www.cnblogs.com/mandymm/p/13968360.html
Copyright © 2011-2022 走看看