日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

深入理解js的同步與異步

瀏覽:198日期:2024-05-26 13:44:38

JavaScript語言的一大特點(diǎn)就是單線程,也就是說,同一個(gè)時(shí)間只能做一件事。那么,為什么JavaScript不能有多個(gè)線程呢?這樣能提高效率啊。

深入理解js的同步與異步

JavaScript的單線程,與它的用途有關(guān)。作為瀏覽器腳本語言,JavaScript的主要用途是與用戶互動(dòng),以及操作DOM。這決定了它只能是單線程,否則會(huì)帶來很復(fù)雜的同步問題。比如,假定JavaScript同時(shí)有兩個(gè)線程,一個(gè)線程在某個(gè)DOM節(jié)點(diǎn)上添加內(nèi)容,另一個(gè)線程刪除了這個(gè)節(jié)點(diǎn),這時(shí)瀏覽器應(yīng)該以哪個(gè)線程為準(zhǔn)?

所以,為了避免復(fù)雜性,從一誕生,JavaScript就是單線程,這已經(jīng)成了這門語言的核心特征,將來也不會(huì)改變。

為了利用多核CPU的計(jì)算能力,HTML5提出Web Worker標(biāo)準(zhǔn),允許JavaScript腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制,且不得操作DOM。所以,這個(gè)新標(biāo)準(zhǔn)并沒有改變JavaScript單線程的本質(zhì)。

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

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

<script type="text/javascript"> console.log( "1" ); setTimeout(function() { console.log( "2" ) }, 0 ); setTimeout(function() { console.log( "3" ) }, 0 ); setTimeout(function() { console.log( "4" ) }, 0 ); console.log( "5" ); </script>

深入理解js的同步與異步

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

火狐瀏覽器的api文檔有這樣一句話:Because even though setTimeout was called with a delay of zero, it's placed on a queue and scheduled to run at the next opportunity, not immediately. Currently executing code must complete before functions on the queue are executed, the resulting execution order may not be as expected.

意思就是:盡管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請(qǐng)求這一類的方法都是耗時(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ì)列"開始通知主線程,請(qǐng)求執(zhí)行任務(wù),該任務(wù)才會(huì)進(jìn)入主線程執(zhí)行。

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

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

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

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

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

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

"任務(wù)隊(duì)列"是一個(gè)事件的隊(duì)列(也可以理解成消息的隊(duì)列),IO設(shè)備完成一項(xiàng)任務(wù),就在"任務(wù)隊(duì)列"中添加一個(gè)事件,表示相關(guān)的異步任務(wù)可以進(jìn)入"執(zhí)行棧"了。主線程讀取"任務(wù)隊(duì)列",就是讀取里面有哪些事件。

"任務(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í)行。

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
五月天久久网站| 中文字幕人成乱码在线观看| 播放一区二区| 黄色aa久久| 在线天堂资源www在线污| 国产精品www.| 国产精品一国产精品k频道56| 国产精品一线| 久久亚洲资源中文字| av最新在线| 91tv亚洲精品香蕉国产一区| 久久黄色影院| 红桃视频欧美| 国产精品毛片在线| 亚洲另类黄色| 国产伦精品一区二区三区视频| 免费亚洲婷婷| 国产v日韩v欧美v| 国产一区清纯| 亚洲影视一区二区三区| 久久成人精品| 欧美日韩1区| 国产一区调教| 色婷婷精品视频| 国产农村妇女精品一二区| 午夜久久av| 久久超碰99| 蜜桃成人精品| 久久不射中文字幕| 欧美偷窥清纯综合图区| 精品国产一区二区三区2021| 亚洲综合电影| 日韩午夜在线| 久久精品97| 国产精选在线| 极品裸体白嫩激情啪啪国产精品| 亚洲欧美久久| 你懂的亚洲视频| 亚洲二区免费| 欧美日本久久| 99热精品久久| 欧美日韩一区二区三区在线电影| 成人片免费看| 亚洲精品在线a| 久久一区视频| 今天的高清视频免费播放成人| 亚洲啊v在线免费视频| 99视频精品全国免费| 亚洲最新无码中文字幕久久 | 亚洲三级av| 欧美精品一区二区三区精品| 精品视频一区二区三区四区五区 | 天海翼精品一区二区三区| 免费观看久久av| 亚洲国产一区二区三区在线播放| 欧美日一区二区| 国产伦精品一区二区三区千人斩| 好看不卡的中文字幕| 欧美黄色精品| 国产精品久久777777毛茸茸| 欧美亚洲自偷自偷| 影音先锋久久精品| 97精品在线| 国产不卡人人| 在线日韩av| 国产精品二区影院| 欧美日韩中文一区二区| 青草综合视频| 黄色在线一区| 国产一区二区三区亚洲| 免费在线观看一区二区三区| 精品久久电影| 亚洲精品在线二区| 日韩高清中文字幕一区二区| 国产日韩欧美中文在线| 国产麻豆久久| 国产福利亚洲| 亚州国产精品| 黄色不卡一区| 高清一区二区| 国产日韩一区二区三区在线播放| 91久久中文| 欧美sm一区| 久久精品一区二区三区中文字幕| 一区二区三区四区在线观看国产日韩| 黄色aa久久| 国产精品亲子伦av一区二区三区| 一区视频在线| 91看片一区| 国产精品v亚洲精品v日韩精品| 亚洲综合丁香| 成人va天堂| 国产成人精品一区二区三区免费| 日本少妇精品亚洲第一区| 亚洲在线电影| 欧美成人高清| 成人小电影网站| 欧美a级一区二区| 日韩在线观看中文字幕| 国产精品7m凸凹视频分类| www在线观看黄色| 欧美国产免费| 国产精品777777在线播放| 日日摸夜夜添夜夜添国产精品| 欧美精选一区二区三区| 日韩欧美综合| 精品视频亚洲| 另类综合日韩欧美亚洲| 国产美女精品视频免费播放软件| 亚洲日本久久| 在线精品一区| 99国产精品久久久久久久成人热| 夜鲁夜鲁夜鲁视频在线播放| 精品国产乱码久久久久久1区2匹| 国产精品中文字幕制服诱惑| 青青草精品视频| 日本久久一区| 亚洲精品日本| 综合一区av| 午夜亚洲福利| 亚洲午夜久久| 视频一区二区中文字幕| 一区二区三区视频免费观看| 亚洲综合五月| 国产精品一区二区精品 | 五月天综合网站| 国产一区白浆| 国产精品嫩模av在线| 国产精品一区二区精品视频观看 | 欧美成人一二区| 欧美一区久久| 久久亚洲精品中文字幕| 久久久久久自在自线| 精品在线99| 欧美黄色精品| 激情婷婷久久| 亚洲成人精品| 国产亚洲一区| 日本一区二区三区视频在线看| 蜜桃av一区二区三区电影| 午夜久久福利| 午夜一级在线看亚洲| 欧美精品一卡| 免费看欧美美女黄的网站| 日韩精品一区第一页| 日韩精选在线| 国产精品综合色区在线观看| 日韩高清国产一区在线| 国产午夜久久av| 久久久亚洲欧洲日产| 激情久久99| 91精品国产成人观看| 2023国产精品久久久精品双| 欧美日韩国产亚洲一区| 中文字幕成人| 国产精品www.| 日韩影院二区| 国产亚洲一区在线| 欧美一区精品| 国产精品高颜值在线观看| 欧美亚洲在线日韩| 乱人伦精品视频在线观看| 亚洲精一区二区三区| 国产日韩高清一区二区三区在线| 精品丝袜久久| 1024精品一区二区三区| 日韩影院在线观看| 国产精品久久久久久av公交车 | 麻豆成人综合网| 91视频一区| 亚洲国产成人精品女人| 日本a口亚洲| 国语精品一区| 在线亚洲国产精品网站| 欧美一区二区三区久久精品| 高清av不卡| 亚洲二区三区不卡| 国产精品视频一区二区三区四蜜臂 | 美女网站久久| 国产精品久av福利在线观看| 久久久一二三| 日韩1区2区日韩1区2区| 欧美不卡高清一区二区三区| 中文字幕成人| 在线天堂资源www在线污| 热久久免费视频| 国产精品调教| 欧美日韩精品免费观看视频完整| 国产日韩免费| 蜜臀av免费一区二区三区| 国产欧美丝祙| 99在线|亚洲一区二区| 国产精品黄色片| 国产一区二区精品| 国产一区二区三区国产精品| 一级欧美视频| 丝袜美腿诱惑一区二区三区| 亚洲精品黄色| 一区二区小说| 黄页网站一区|