zoukankan      html  css  js  c++  java
  • 了解javascript的运行机制

    前端,不管是刚入门的菜鸟还是工作了几年的老手,不管是面试还是日常开发都需要用到,但是你对javascript了解么,说实话我也不太了解,我只是会用。

    javsscript是一门单线程语言,单线程意味着同一时间内只能做一件事,做完这一件才能做下一件。

    JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题,提高效率。

    说之前我们来看个例子,也是面试中常见的:

    console.log(1)
    
    setTimeout(function(){
        console.log(2)
    });
    
    new Promise(function(resolve){
        console.log(3);
        setTimeout(function(){
            console.log(4)
        });
    }).then(function(){
        console.log(5)
    });
    
    console.log(6);
    
    //问打印出的结果

     让你说出打印出的先后顺序

     这下就有点懵了;(1、2、3、4、5、6) 还是(1、6、2、3、4、5)等等多种答案

     js是单线程,需要执行完一个事件再执行下一个。如果加载页面需要加载的资源很多很慢,需要很久时间,这给用户造成了很不好的体验,所以就衍生出了同步任务和异步任务。

     同步任务:在主线程上排队执行,前一个任务执行完了才会执行下一个;

     异步任务:不进入主线程,进入任务队列(task queue)的任务,只有任务队列通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

     异步任务又分为宏任务和微任务:

    • 宏任务(macro-task):整体代码script、setTimeOut、setInterval
    • 微任务(mincro-task):promise.then、process.nextTick(node)

      

      

     同步任务会直接进入主线程执行,当主线程内的任务执行完毕,主线程为空时,会检查微任务的Event Queue,如果有任务,就全部执行,如果没有就执行下一个宏任务;这就是Event Loop时间循环

    了解过后我们再看之前的例子

    console.log(1) // 同步任务
    
    setTimeout(function () { // 异步任务的宏任务
        console.log(2)
    });
    
    // 注意:new Promise中这个是同步任务
    new Promise(function (resolve) {
        console.log(3); // 同步任务
        setTimeout(function () { // 异步任务中的宏任务
             console.log(4)
          });
    ).then(function () { // 异步任务中的微任务
        console.log(5)
    });
    
     console.log(6); // 同步任务
    
      // 所以执行循序为:
      // 1 3 6 5 2 4

    最后来一个复杂一点的,测试一下自己

    function add(x, y) {
      console.log(1) // 同步任务
      setTimeout(function() {
        console.log(2) // 异步任务的宏任务
      }, 1000)
    }
    add();
    
    setTimeout(function() {
      console.log(3) // 异步任务的宏任务
    })
    
    new Promise(function(resolve) {
      console.log(4) // 同步任务
      setTimeout(function() {
        console.log(5) // 异步任务的宏任务
      }, 100)
    }).then(function() {
      setTimeout(function() {
        console.log(6)  // 异步任务的宏任务
      }, 0)
      console.log(7) // 异步任务的微任务
    })
    
    console.log(8) // 同步任务

    // 执行结果:1,4,8,7,3,6,5,2

    每天记录学习一点

  • 相关阅读:
    centos安装pip
    centos修改国内镜像源
    centos配置snmp服务
    django使用ModelForm上传文件
    Vue slot
    umi3.2+ targets ie不生效的问题
    mongo环境快速搭建工具 mlaunch
    mac上常用软件
    磁盘性能测试工具 iozone
    磁盘性能测试工具 bonnie++
  • 原文地址:https://www.cnblogs.com/0314dxj/p/13178090.html
Copyright © 2011-2022 走看看