最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JavaScript 的 Even Loop

    正文概述 掘金(学前端)   2020-11-27   689

    JavaScript 是一门单线程的语言,它的异步和多线程的实现是通过 Event Loop 事件循环机制来实现的

    讲一下 Event Loop 的机制

    大体三个部分组成

    1、调用栈 Stack

    2、消息队列 Message Queue

    3、微任务队列 Microtask Queue

    Event Loop 开始的时候会从全局栈开始逐行执行,遇到函数调用,会把函数压入到调用栈中,当函数返回后,会从调用栈中弹出

     案例 1 :
     function func1(){
        console.log(1);
     }
     function func2(){
        console.log(2);
        func1();
        console.log(3);
     }
     func2();
     
     **上述代码执行过程
     1、首先将 func2() 压入到调用栈中,执行内部代码,遇到console.log(2);输出2,执行完毕从调用栈中弹出console.log(2)
     2、遇到func1() 压入到调用栈中,执行内部代码,输出 console.log(1); 此时 func1执行完毕,从调用栈中弹出;
     3、执行console.log(3);到这里 func2()全部执行完成,整个调用栈被清空
    

    如果javascript中定时器,会将异步程序放进Message Queue消息队列中

    案例 2 :
    function func1(){
       console.log(1);
    };
    function func2(){
       setTimeout(()=>{
         console.log(2);	
       },0); 	
       func1();
       console.log(3);
    };
    func2(); //1 , 3 , 2
    **上述代码执行过程
    1、func2()开始执行,压入到调用栈,开始执行func2内部的代码
    2、将setTimeout()压入调用栈时,里面的回调函数会被放进消息队列,消息会在调用栈清空的时候执行;
    3、将func1 放入栈,执行输出console.loog(1);执行完成弹出func1;
    4、执行完console.log(3)的时候,弹出func2,此时调用栈已经被清空;
    5、将消息队列的消息压入到调用栈执行,输出console.log(2),清空栈。
    

    如果使用 async 、 promise 创建的异步操作 会加入到Microtask Queue微任务队列里面, 会在调用栈被清空的时候,立即执行,并且处理期间新加入的微任务也会一起执行

    案例 3 :
    var p = new Promise(resolve=>{
       console.log(4);
       resolve(5);
    });
    function func1(){
       console.log(1);
    };
    function func2(){
       setTimeout(()=>{
       	console.log(2);	
       },0); 	
       func1();
       console.log(3);
       p.then(resolved=>{
       	console.log(resolved)
       }).then(()=>{
       	console.log(6)
       })
    };
    func2(); // 4, 1, 3, 5, 6, 2
    **上述代码执行过程:
    1、new Promise 构造函数会首先被压入调用栈中,执行console.log(4);
       resolve(5); 执行完成后,从栈中弹出 new Promise
    2、func2压入栈,将
    	setTimeout(()=>{
       	console.log(2);	
       },0);压入栈,并将回调函数放入 消息队列;
    3、将func1 压入栈,输出console.log(1);从栈中弹出func1;
    4、输出console.log(3)后弹出
    5、将promise后面的两个 .then的回调函数会入队到微任务队列里面;
    6、func2执行完成,从栈中弹出,此时调用栈已经被清空了
    7、将微任务队列中的任务,把他们压入到调用栈分别执行,输入
    	console.log(resolved)
    	console.log(6)
       执行完之后清空调用栈
    8、最后压入并执行消息队列里面的消息console.log(2);
    至此,全部执行完成。
    

    本内容纯属学习的时候整理的笔记,如果哪里有问题还请各位大佬务必给出建议和指点


    起源地下载网 » JavaScript 的 Even Loop

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元