zoukankan      html  css  js  c++  java
  • 为什么JS是单线程?JS中的Event Loop(事件循环)?JS如何实现异步?setimeout?

    https://segmentfault.com/a/1190000012806637

    https://www.jianshu.com/p/93d756db8c81

    首先,请牢记2点:

    (1) JS是单线程语言

    (2) JS的Event Loop是JS的执行机制。

     Event Loop (事件循环):

        只要主线程空了,就去读取“任务队列”,从任务队列中读取事件,这个过程是循环不断的,所以整个的这个运行机制叫  Event Loop。

         主线程运行的时候,产生堆(head)和栈(stack),栈中的代码(同步任务)调用各种外部API,它们在“任务队列”(异步任务)中加入各种事件(click, load, done 等), 只要栈中的代码(同步任务)执行完毕,主线程就会去读取“任务队列”(异步任务),依次去执行那些事件所对应的回调函数。

    除了广义的同步任务和异步任务,我们对任务更准确的划分方式是:

    Macrotask  (宏任务):

    包括整体代码script

    etImmediate:把回调函数放在事件队列的尾部

    setTimeout:定时器

    setInterval:定时器

    Microtask 微任务):

    process.nextTick:把回调函数放在当前执行栈的底部

    Promise:

    按照这种分类方式:JS的执行机制是:

    • 执行一个宏任务,过程中如果遇到微任务,就将其放到微任务的【事件队列】里
    • 当前宏任务执行完成后,会查看微任务的【事件队列】,并将里面全部的微任务依次执行完

    重复以上2步骤,就是更为准确的JS执行机制了。

    Node.js的Event Loop: 

    Node.js的Event Loop

    1. V8引擎解析JavaScript脚本。

    2. 解析后的代码,调用Node API。

    3. libuv库负责Node API的执行。它将不同的任务分配给不同的线程,形成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎。

    4. V8引擎再将结果返回给用户。

     

    灵魂三问 : JS为什么是单线程的? 为什么需要异步? JS单线程又是如何实现异步的呢?

    (1)JS为什么是单线程的?

    JavaScript的主要用途主要是用户互动,和操作DOM。如果JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时这两个节点会有很大冲突,为了避免这个冲突,所以决定了它只能是单线程。

    (2)为什么需要异步?

    如果JS中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。 对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验。所以,JS中存在异步执行。

    (3)单线程又是如何实现异步的呢?

     JS是通过的事件循环(event loop),理解了event loop机制,就理解了JS的执行机制

    谈谈setTimeout

    这段setTimeout代码什么意思? 我们一般说: 3秒后,会执行setTimeout里的那个函数

     setTimeout(function(){
        console.log('执行了')
     },3000)    

    但是这种说并不严谨,准确的解释是: 3秒后,setTimeout里的函数被会推入event queue,而event queue(事件队列)里的任务,只有在主线程空闲时才会执行。

    所以只有满足 (1)3秒后 (2)主线程空闲,同时满足时,才会3秒后执行该函数

    如果主线程执行内容很多,执行时间超过3秒,比如执行了10秒,那么这个函数只能10秒后执行了

    计时器

    function count( )
    { x = x + 1
      document.display.box.value= x
      timeoutID=setTimeout("count()", 1000)
    }

    解决setInterval计时器不准的问题

    https://www.cnblogs.com/flash3d/archive/2014/05/08/3715600.html

  • 相关阅读:
    区分JS的空值
    死锁
    高效的SQLSERVER分页方案
    IIS经典模式VS集成模式
    MVC过滤器
    Request接收参数乱码原理解析
    int三种转化区别
    Area使用
    Action和Partial等区别
    Log4Net
  • 原文地址:https://www.cnblogs.com/leftJS/p/10959665.html
Copyright © 2011-2022 走看看