美文网首页Web前端之路让前端飞Web 前端开发
《前端JavaScript面试技巧》学习笔记(4)异步和单线程

《前端JavaScript面试技巧》学习笔记(4)异步和单线程

作者: 一杯浊酒 | 来源:发表于2017-09-19 21:38 被阅读106次

    问题

    1.同步和异步的区别是什么?分别举一个同步和异步的例子
    2.一个关于setTimeout的笔试题
    3.前端使用异步的场景有哪些

    知识点

    1: 什么是异步?
    2: 前端使用异步的场景有哪些?
    3: 异步和单线程


    1: 什么是异步?
    先看下面两个例子

    console.log(100);
    setTimeout(function() {
        console.log(200)
    },2000);
    console.log(300)
    // 100
    // 300
    // +2s后 200
    

    异步不会阻塞后面代码的执行,上述代码中会先打印100,然后打印300,延时加载的内容会在一秒后,最后打印出来,代码不会在打印了100后等待两秒,再打印300


    对比同步

    console.log(100);
    alert(200); // x 秒后点击确认
    console.log(300);
    

    同步会阻塞后面代码的执行,上述代码中,alert后如果不点击确认就不会执行后面的代码

    • 何时需要异步?
    • 在可能发生等待的情况(在等待过程中我们需要继续去做我们需要做的事情,不能让它卡在这儿)
    • 在等待过程中不能像alert一样阻塞程序的运行
    • 因此所有等待的情况都需要异步

    2: 前端使用异步的场景

    • 定时任务 : setTimeout , setInterval
    • 网络加载 : ajax 的请求 , 动态< img >加载
    • 事件绑定 : 绑定一个点击事件后,用户什么时候点不知道,但是在用户点击之前,后面的代码该干嘛还得干嘛,不能因为用户没有点击而卡在那儿

    ajax 请求代码示例

    console.log('start');
        $.get("test.json",function(data){
            console.log(data)
        });
        console.log('end')
        //执行结果:
        //100
        //300
        //[Object { url="www.jianshu.com"}]
    

    img 加载示例

     console.log('start')
            var img = document.createElement("img");
            img.onload = function() {
                console.log('loaded')
            }
            img.src = 'loading7.gif'
            console.log('end')
            //执行结果:
            //start
            //end
            //loaded
    

    事件绑定示例

             console.log('start')
             document.addEventListener('click',function(){
                alert('clicked')
               })
            console.log('end')
    

    3: 单线程
    JavaScript 是单线程执行的语句
    什么是单线程 : 就是一次只能干一件事(执行一个语句),一个一个排队来,不能将所有语句同时执行
    例子 :

    console.log(100);
    setTimeout(function() {
        console.log(200)
    }); // 这里没有设置加载时间
    console.log(300)
    // 执行的顺序 100; 300; 200
    

    执行顺序解释: 首先打印出 100;然后执行到 setTimeout 时;因为它是异步,会先将它给拎出来放到一边,然后再执行下面的,打印出300,然后再将刚拎出来的 setTimeout 执行;

    1: 执行第一行,打印100
    2: 执行 setTimeout 后,传入setTimeout 的函数会被暂存起来,不会立即执行(单线程的特点,不能同时干两件事)
    3: 执行最后一行,打印 300
    4: 待所有程序执行完后,处于空闲状态时,会立马看有没有 暂存起来的要执行.


    解题:

    1: 同步和异步的区别是什么?分别举一个同步和异步的例子
    - 最大的区别在于是否会阻塞后面代码的执行,同步会阻塞代码的执行,而异步不会
    - alert 是同步,setTimeout 是异步
    2: 一个关于setTimeout 的笔试题

    console.log(1);
    setTimeout(function(){
      console.log(2);
    },0)
    console.log(3);
    setTimeout(function(){
      console.log(4);
    },1000)
    console.log(5);
    //1
    //3
    //5
    //2
    //+1s后 4
    

    3: 前端使用异步的场景有哪些?

    • 定时任务 : setTimeout , setInterval
    • 网络加载 : ajax 的请求 , 动态< img >加载
    • 事件绑定 : 绑定一个点击事件后,用户什么时候点不知道,但是在用户点击之前,后面的代码该干嘛还得干嘛,不能因为用户没有点击而卡在那儿

    上面场景使用异步的共同特点:都要等待的时间,有等待就有卡顿,所以要用到异步


    相关文章

      网友评论

        本文标题:《前端JavaScript面试技巧》学习笔记(4)异步和单线程

        本文链接:https://www.haomeiwen.com/subject/ccyesxtx.html