亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JS基礎(chǔ)——同步異步的區(qū)別

ztyzz / 3304人閱讀

摘要:只要指定過這些事件的回調(diào)函數(shù),這些事件發(fā)生時(shí)就會(huì)進(jìn)入任務(wù)隊(duì)列,等待主線程讀取。異步任務(wù)必須指定回調(diào)函數(shù),當(dāng)主線程開始執(zhí)行異步任務(wù),就是執(zhí)行對(duì)應(yīng)的回調(diào)函數(shù)。

javascript語言是一門“單線程”的語言,
不像java語言,類繼承Thread再來個(gè)thread.start就可以開辟一個(gè)線程。
所以,javascript就像一條流水線,僅僅是一條流水線而已,要么加工,要么包裝,不能同時(shí)進(jìn)行多個(gè)任務(wù)和流程。

“同步”——一下就讓人想到“一起”這個(gè)詞;

“異步”呢,從字面來講,好像是在不同的(異)的ways上do something,
那首先想到的詞可能是“一邊...一邊...”,比如‘小明一邊吃雪糕一邊寫作業(yè)’,這完全沒毛病,雪糕吃完了,作業(yè)也寫完了,這就是異步?那就大錯(cuò)特錯(cuò)了!

其實(shí)同步和異步,
無論如何,做事情的時(shí)候都是只有一條流水線(單線程),
同步和異步的差別就在于這條流水線上各個(gè)流程的執(zhí)行順序不同。

最基礎(chǔ)的異步是setTimeout和setInterval函數(shù),
很常見,但是很少人有人知道其實(shí)這就是異步,
因?yàn)樗鼈兛梢钥刂苆s的執(zhí)行順序。我們也可以簡單地理解為:
可以改變程序正常執(zhí)行順序的操作就可以看成是異步操作。如下代碼:

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

輸出順序是什么呢?

可見,盡管我們設(shè)置了setTimeout(function,time)中的等待時(shí)間為0,結(jié)果其中的function還是后執(zhí)行。

盡管setTimeout的time延遲時(shí)間為0,
其中的function也會(huì)被放入一個(gè)隊(duì)列中,等待下一個(gè)機(jī)會(huì)執(zhí)行,
當(dāng)前的代碼(指不需要加入隊(duì)列中的程序)必須在該隊(duì)列的程序完成之前完成,
因此結(jié)果可能不與預(yù)期結(jié)果相同。

這里說到了一個(gè)“隊(duì)列”(即任務(wù)隊(duì)列),
該隊(duì)列放的是什么呢,放的就是setTimeout中的function,
這些function依次加入該隊(duì)列,
即該隊(duì)列中所有function中的程序?qū)?huì)在該隊(duì)列以外的所有代碼執(zhí)行完畢之后再以此執(zhí)行,
這是為什么呢?因?yàn)樵趫?zhí)行程序的時(shí)候,瀏覽器會(huì)默認(rèn)setTimeout以及ajax請求這一類的方法都是耗時(shí)程序(盡管可能不耗時(shí)),
將其加入一個(gè)隊(duì)列中,該隊(duì)列是一個(gè)存儲(chǔ)耗時(shí)程序的隊(duì)列,在所有不耗時(shí)程序執(zhí)行過后,再來依次執(zhí)行該隊(duì)列中的程序。

又回到了最初的起點(diǎn)——javascript是單線程。 單線程就意味著,所有任務(wù)需要排隊(duì),前一個(gè)任務(wù)結(jié)束,才會(huì)執(zhí)行后一個(gè)任務(wù)。
如果前一個(gè)任務(wù)耗時(shí)很長,后一個(gè)任務(wù)就不得不一直等著。

于是就有一個(gè)概念——任務(wù)隊(duì)列。如果排隊(duì)是因?yàn)橛?jì)算量大,CPU忙不過來,倒也算了,
但是很多時(shí)候CPU是閑著的,因?yàn)镮O設(shè)備(輸入輸出設(shè)備)很慢(比如Ajax操作從網(wǎng)絡(luò)讀取數(shù)據(jù)),不
得不等著結(jié)果出來,再往下執(zhí)行。于是JavaScript語言的設(shè)計(jì)者意識(shí)到,這時(shí)主線程完全可以不管IO設(shè)備,
掛起處于等待中的任務(wù),先運(yùn)行排在后面的任務(wù)。等到IO設(shè)備返回了結(jié)果,再回過頭,把掛起的任務(wù)繼續(xù)執(zhí)行下去。

于是,所有任務(wù)可以分成兩種,

一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous)。 同步任務(wù)指的是,在主線程上排隊(duì)執(zhí)行的任務(wù),
只有前一個(gè)任務(wù)執(zhí)行完畢,才能執(zhí)行后一個(gè)任務(wù); 異步任務(wù)指的是,不進(jìn)入主線程、而進(jìn)入"任務(wù)隊(duì)列"(task queue)的任務(wù),
只有等主線程任務(wù)執(zhí)行完畢,"任務(wù)隊(duì)列"開始通知主線程,請求執(zhí)行任務(wù),該任務(wù)才會(huì)進(jìn)入主線程執(zhí)行。

具體來說,異步運(yùn)行機(jī)制如下:

所有同步任務(wù)都在主線程上執(zhí)行,形成一個(gè)執(zhí)行棧(execution context stack)。

主線程之外,還存在一個(gè)"任務(wù)隊(duì)列"(task queue)。只要異步任務(wù)有了運(yùn)行結(jié)果,就在"任務(wù)隊(duì)列"之中放置一個(gè)事件。

一旦"執(zhí)行棧"中的所有同步任務(wù)執(zhí)行完畢,系統(tǒng)就會(huì)讀取"任務(wù)隊(duì)列",看看里面有哪些事件。那些對(duì)應(yīng)的異步任務(wù),于是結(jié)束等待狀態(tài),進(jìn)入執(zhí)行棧,開始執(zhí)行。

主線程不斷重復(fù)上面的第三步。

只要主線程空了,就會(huì)去讀取"任務(wù)隊(duì)列",這就是JavaScript的運(yùn)行機(jī)制。這個(gè)過程會(huì)不斷重復(fù)。

"任務(wù)隊(duì)列"中的事件,除了IO設(shè)備的事件以外,
還包括一些用戶產(chǎn)生的事件(比如鼠標(biāo)點(diǎn)擊、頁面滾動(dòng)等等),
比如$(selectot).click(function),這些都是相對(duì)耗時(shí)的操作。
只要指定過這些事件的回調(diào)函數(shù),這些事件發(fā)生時(shí)就會(huì)進(jìn)入"任務(wù)隊(duì)列",等待主線程讀取。

所謂"回調(diào)函數(shù)"(callback),就是那些會(huì)被主線程掛起來的代碼,前面說的點(diǎn)擊事件$(selectot).click(function)中的function就是一個(gè)回調(diào)函數(shù)。異步任務(wù)必須指定回調(diào)函數(shù),當(dāng)主線程開始執(zhí)行異步任務(wù),就是執(zhí)行對(duì)應(yīng)的回調(diào)函數(shù)。例如ajax的success,complete,error也都指定了各自的回調(diào)函數(shù),這些函數(shù)就會(huì)加入“任務(wù)隊(duì)列”中,等待執(zhí)行。

作者:YinghaoGuo
來源:CSDN
原文:https://blog.csdn.net/qq_2285...
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/101357.html

相關(guān)文章

  • JS基礎(chǔ)異步和單線程

    摘要:同步和異步的區(qū)別是什么是單線程的,只能同時(shí)做一件事,所以就需要異步同步會(huì)阻塞代碼執(zhí)行,而異步不會(huì)是同步,是異步異步同步秒之后點(diǎn)擊確認(rèn)何時(shí)需要異步在可能發(fā)生等待的情況,等待過程中不能像一樣阻塞程序進(jìn)行。因此,所有等待的情況都需要異步。 同步和異步的區(qū)別是什么? js是單線程的,只能同時(shí)做一件事,所以就需要異步同步會(huì)阻塞代碼執(zhí)行,而異步不會(huì)alert是同步,setTimeout是異步 //...

    Mr_zhang 評(píng)論0 收藏0
  • 50道JavaScript基礎(chǔ)面試題(附答案)

    摘要:事件中屬性等于。響應(yīng)的狀態(tài)為或者。同步在上會(huì)產(chǎn)生頁面假死的問題。表示聲明的變量未初始化,轉(zhuǎn)換為數(shù)值時(shí)為。但并非所有瀏覽器都支持事件捕獲。它由兩部分構(gòu)成函數(shù),以及創(chuàng)建該函數(shù)的環(huán)境。 1 介紹JavaScript的基本數(shù)據(jù)類型Number、String 、Boolean 、Null、Undefined Object 是 JavaScript 中所有對(duì)象的父對(duì)象數(shù)據(jù)封裝類對(duì)象:Object、...

    huaixiaoz 評(píng)論0 收藏0
  • JS基礎(chǔ)】一文看懂前端模塊化規(guī)范

    摘要:參考資料前端模塊化詳解完整版入門近一萬字的語法知識(shí)點(diǎn)補(bǔ)充徹底搞清楚中的和和詳解 前言 前端的模塊化之路經(jīng)歷了漫長的過程,想詳細(xì)了解的小伙伴可以看浪里行舟大神寫的前端模塊化詳解(完整版),這里根據(jù)幾位大佬們寫的文章,將模塊化規(guī)范部分做了匯總和整理,希望讀完的小伙伴能有些收獲,也希望覺得有用的小伙伴可以點(diǎn)個(gè)贊,筆芯。 什么是模塊 將一個(gè)復(fù)雜的程序依據(jù)一定的規(guī)則(規(guī)范)封裝成幾個(gè)塊(文件)...

    HelKyle 評(píng)論0 收藏0
  • 同步異步異步與回調(diào)

    摘要:同步與異步以上為同步代碼,函數(shù)必須等函數(shù)執(zhí)行完畢后才能執(zhí)行。異步回調(diào)產(chǎn)生的結(jié)果就是,函數(shù)的調(diào)用并不直接返回結(jié)果,而往往是交給回調(diào)函數(shù)進(jìn)行異步處理。 同步與異步: function a(){} function b(){} a(); b(); 以上為同步代碼,函數(shù)b必須等函數(shù)a執(zhí)行完畢后才能執(zhí)行。 function a(){ ...

    dinfer 評(píng)論0 收藏0
  • 夯實(shí)基礎(chǔ)-JavaScript異步編程

    摘要:調(diào)用棧被清空,消息隊(duì)列中并無任務(wù),線程停止,事件循環(huán)結(jié)束。不確定的時(shí)間點(diǎn)請求返回,將設(shè)定好的回調(diào)函數(shù)放入消息隊(duì)列。調(diào)用棧執(zhí)行完畢執(zhí)行消息隊(duì)列任務(wù)。請求并發(fā)回調(diào)函數(shù)執(zhí)行順序無法確定。 異步編程 JavaScript中異步編程問題可以說是基礎(chǔ)中的重點(diǎn),也是比較難理解的地方。首先要弄懂的是什么叫異步? 我們的代碼在執(zhí)行的時(shí)候是從上到下按順序執(zhí)行,一段代碼執(zhí)行了之后才會(huì)執(zhí)行下一段代碼,這種方式...

    shadowbook 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<