• 技术文章 >web前端 >前端问答

    javascript中异步和同步的区别是什么

    青灯夜游青灯夜游2021-06-09 17:03:43原创70

    区别:在同步中,发出一个功能调用时,必须一件一件事做,等前一件做完了才能做下一件事;而在异步中,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。

    本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

    javascript语言是一门“单线程”的语言,

    不像java语言,类继承Thread再来个thread.start就可以开辟一个线程。

    所以,javascript就像一条流水线,仅仅是一条流水线而已,要么加工,要么包装,不能同时进行多个任务和流程。

    “同步”——一下就让人想到“一起”这个词;


    “异步”呢,从字面来讲,好像是在不同的(异)的ways上do something,

    那首先想到的词可能是“一边...一边...”,比如‘小明一边吃雪糕一边写作业’,这完全没毛病,雪糕吃完了,作业也写完了,这就是异步?那就大错特错了!


    其实同步和异步,

    无论如何,做事情的时候都是只有一条流水线(单线程)

    同步和异步的差别就在于这条流水线上各个流程的执行顺序不同。

    最基础的异步是setTimeout和setInterval函数,

    很常见,但是很少人有人知道其实这就是异步,

    因为它们可以控制js的执行顺序。我们也可以简单地理解为:

    可以改变程序正常执行顺序的操作就可以看成是异步操作。如下代码:

        console.log( "1" );
        setTimeout(function() {
            console.log( "2" )
        }, 0 );
        setTimeout(function() {
            console.log( "3" )
        }, 0 );
        setTimeout(function() {
            console.log( "4" )
        }, 0 );
        console.log( "5" );

    输出顺序是什么呢?

    1.png

    可见,尽管我们设置了setTimeout(function,time)中的等待时间为0,结果其中的function还是后执行。

    尽管setTimeout的time延迟时间为0,

    其中的function也会被放入一个队列中,等待下一个机会执行,

    当前的代码(指不需要加入队列中的程序)必须在该队列的程序完成之前完成,

    因此结果可能不与预期结果相同。

    这里说到了一个“队列”(即任务队列),

    该队列放的是什么呢,放的就是setTimeout中的function,

    这些function依次加入该队列,

    即该队列中所有function中的程序将会在该队列以外的所有代码执行完毕之后再以此执行,

    这是为什么呢?因为在执行程序的时候,浏览器会默认setTimeout以及ajax请求这一类的方法都是耗时程序(尽管可能不耗时),
    将其加入一个队列中,该队列是一个存储耗时程序的队列,在所有不耗时程序执行过后,再来依次执行该队列中的程序。

    又回到了最初的起点——javascript是单线程。 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。
    如果前一个任务耗时很长,后一个任务就不得不一直等着。

    于是就有一个概念——任务队列。如果排队是因为计算量大,CPU忙不过来,倒也算了,

    但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。于是JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

    于是,所有任务可以分成两种,

    一种是同步任务(synchronous),另一种是异步任务(asynchronous)。 同步任务指的是,在主线程上排队执行的任务,
    只有前一个任务执行完毕,才能执行后一个任务; 异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。

    具体来说,异步运行机制如下:



    只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。

    "任务队列"中的事件,除了IO设备的事件以外,

    还包括一些用户产生的事件(比如鼠标点击、页面滚动等等),

    比如$(selectot).click(function),这些都是相对耗时的操作。

    只要指定过这些事件的回调函数,这些事件发生时就会进入"任务队列",等待主线程读取。

    所谓"回调函数"(callback),就是那些会被主线程挂起来的代码,前面说的点击事件$(selectot).click(function)中的function就是一个回调函数。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。例如ajax的success,complete,error也都指定了各自的回调函数,这些函数就会加入“任务队列”中,等待执行。

    更多编程相关知识,请访问:编程视频!!

    以上就是javascript中异步和同步的区别是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:javascript 异步 同步
    上一篇:JavaScript和Python啥区别 下一篇:JavaScript中进程和线程的区别是什么
    第16期线上培训班

    相关文章推荐

    • javascript bom是什么• javascript中声明变量的关键字是什么• typescript和javascript的区别有哪些• javaScript什么叫事件源• javascript如何设置文本框输入时变颜色

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网