美文网首页ES6专题
4.异步和单线程

4.异步和单线程

作者: 飞菲fly | 来源:发表于2017-08-16 11:27 被阅读77次

    js的三座大山

    1.原型和原型链
    2.作用域和闭包
    3.异步和单线程
    +变量的类型和计算+后边的知识

    //-------------题目---------------
    
    1.同步和异步的区别是什么?分别举一个同步和异步的例子
        *同步会阻塞代码执行,异步不会;
        *alert是同步,setTimeout是异步;
    
    2.一个关于setTimeout的笔试题
    //打印顺序:1--3--5--2--1秒之后4
    console.log(1);
    setTimeout(function(){
        console.log(2);
    },0);
    console.log(3);
    setTimeout(function(){
        console.log(4);
    },1000);
    console.log(5);
    
    3.前端使用异步的场景有哪些

    3个场景的特点是都需要等待,为什么等待需要异步呢,因为等待的过程中不 能有卡顿,不能阻塞;这一切的方法和设计都是因为js单线程语言决定的,单线程就只允许同时做一件事,如果想同时做多个,那其他的都必须去一边排队去,先做好一件事把剩余的做完了在做其他的,这是一个串行的过程

    1.定时任务:setTimeout,setInterval
    2.网络请求:ajax请求,动态<img>加载
    3.事件绑定
    

    //---------------知识点-----------------

    1.什么是异步(对比同步)
      //最大的区别:有没有阻塞后面程序的进行
      //同步:会阻塞代码的执行
      //异步:(我走我的,我走完之后,回来再说)
    
     /*****何时需要异步(什么情况下需要等待,什么情况需要异步)*******
      *在可能发生等待的情况
     (如果需要等待,不能卡在这,需要等待过程中继续去做该做的事情)
      *等待过程中不能像alert一样阻塞程序进行
      *因此,所有的“等待的情况”都需要异步
    
    2.前端使用异步的场景有哪些
       1.定时任务:setTimeout,setInterval  
       2.网络请求:ajax请求,动态<img>加载
    

    *1、请求一个线上数据需要等待,如果网络情况好的话,几十毫秒、100毫秒就把这个数据拿到了,在计算机中这个一个非常长的时间,这个时间不能卡着,而且你一个页面肯定有很多请求,一请求就卡着,网页就没法看了
    *2、如果网络请求不好的话,一个接口的请求可能有几秒钟的时间,几秒钟不能卡着)
    *3、如果网页中使用了一google的cdn,结果近几年google在国内不能用了,请求不到我们的页面不能白着,请求这个事情我们最后不做了,后边的该怎么做怎么做,不能因为请求不到就卡着

    3.事件绑定

    1个点击事件绑上之后,它什么时候点不知道,但是在它点之前下面该干什么干什么,不能因为用户不点这个按钮了,下面的事情就不做了;绑上之后爱点不点,点了之后是点了之后的事情,不点还得往下走。

     eg:1.
      //先打印100--300,一秒之后打印200
      console.log(100);
      //等待一秒之后打印出来200
      setTimeout(function(){
        console.log(200);
      },1000);
      console.log(300);
    
     eg:2.对比同步
      //打印100之后,弹出框弹出200等待确认,确认之后再打印300
      console.log(100);
      alert(200); //在没有点击确认之前,300不会被打印出来
      console.log(300);
    
     eg:3.ajax请求代码示例
      //打印顺序start--end--等着这个请求返回之后在执行回调函数打出data1
      console.log('start');
       $.get('./data1.json',function(data1){
            console.log(data1);
       });
      console.log('end');
      
    eg:4.<img>加载示例
        //先打印start--end--先定义一个img,img加载完之后打印loaded
        console.log('start');
        var img = document.createElement('img');
        img.onload = function(){
            //这个不会执行,因为它还没回来,只有等到img加载完之后打印
            console.log('loaded');
        };
        img.src = '/xxx.png';
        console.log('end');
        
      eg:5.事件绑定示例
    //打印顺序:start--end--用户什么时候触发这个事件什么时候打clicked
        console.log('start');
        document.getElementById('btn1').addEventListener('click',function(){
            console.log('clicked');
        });
        console.log('end');
    
    3.异步和单线程

    异步和单线程的关系:
    js是个单线程的语言,单线程一次只能干一件事,不能让我干两件,如果想让干多件(同时去干两件事),那就必须有一个到一边排队去,我先干完这个在说,如果没有异步的话,就会出现卡顿的情况;(如果没有异步干完第一件事,在干第二件事,第三件事的时候有可能会出现等待的现象,单线程肯定得等着,等着之后就会出现卡顿,只有异步才能搞定这个问题,想等着就去后边等着,先把接下来的事情搞定之后在去处理等待这个事情)

    js之所以是异步,因为它是单线程执行的语言,必须有异步
    单线程:一次只能干一件事(一次不能同时干两件事),如果想只能是一个一个排队来,每个函数拿来就坐着,哪行程序拿来就执行哪一行

    eg:1.打印顺序:100--300---200
        /*
        *执行第一行打印100;
        *执行setTimeout后,传入setTimeout的函数会被暂存起来,不会立即执行(单线程的特点,不能同时干两件事);
        *执行最后一行,打印300;
        *待所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行;
      *发现暂存起来的setTimeout中的函数无序等待时间,就立即过来行。
        */
        
        console.log(100);
        
        //setTimeout是异步的场景,所有的异步的陈述都会被拿出去暂时不执行
        //setTimeout函数是个异步,把它其中的函数拿出来,放一边等着;
        在往下执行完300,这个时候确定程序都已经执行完之后,在把之前那个函数拿过来看看;确认它是不是可以立即执行,因为这个setTimeout这个后边没有加等待时间,它可以立即执行,那200执行
        
        setTimeout(function(){
            console.log(200);
        });
        console.log(300);
    
    eg:2.setTimeout有延迟时间
        //打印顺序:100--setTimeout里面函数先暂存起来--300--一秒钟之后执 行setTimeout打印200
        console.log(100);
        setTimeout(function(){
            console.log(200);
        },1000);
        console.log(300);
        
    eg:3.ajax 
        //打印:start--发送请求之后等待,里面函数暂存起来--end--发送请求
        回来之后执行打印data
        console.log('start');
        $.get('./data1.json',function(data){
            console.log(data);
        });
        console.log('end');
        
    eg:4.事件
        //打印:start--绑定事件的回调函数暂存起来--end--点击的时候才能解封执行clicked
        console.log('start');
        document.getElementById('btn1').addEventListener('click',function(){
            alert('clicked');
            
        });
        console.log('end');

    相关文章

      网友评论

        本文标题:4.异步和单线程

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