亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript異步處理工作機制詳解

2019-11-20 12:42:39
字體:
來源:轉載
供稿:網友

從基礎的層面來講,理解JavaScript的定時器是如何工作的是非常重要的。計時器的執行常常和我們的直觀想象不同,那是因為JavaScript引擎是單線程的。我們先來認識一下下面三個函數是如何控制計時器的。

var id = setTimeout(fn, delay); - 初始化一個計時器,然后在指定的時間間隔后執行。該函數返回一個唯一的標志ID(Number類型),我們可以使用它來取消計時器。
var id = setInterval(fn, delay); - 和setTimeout有些類似,但它是連續調用一個函數(時間間隔是delay參數)直到它被取消。
clearInterval(id);, clearTimeout(id); - 使用計時器ID(setTimeout 和 setInterval的返回值)來取消計時器回調的發生
為了理解計時器的內在執行原理,有一個重要的概念需要加以探討:計時器的延遲(delay)是無法得到保障的。由于所有JavaScript代碼是在一個線程里執行的,所有異步事件(例如,鼠標點擊和計時器)只有擁有執行機會時才會執行。

在這個圖表中有許多信息需要理解,如果完全理解了它們,你會對JavaScript引擎如何實現異步事件有一個很好的認識。這是一個一維的圖標:垂 直方向表示時間,藍色的區塊表示JavaScript代碼執行塊。例如第一個JavaScript代碼執行塊需要大約18ms,鼠標點擊所觸發的代碼執行 塊需要11ms,等等。

由于JavaScript引擎同一時間只執行一條代碼(這是由于JavaScript單線程的性質),所以每一個JavaScript代碼執行塊會 “阻塞”其它異步事件的執行。這就意味著當一個異步事件發生(例如,鼠標點擊,計時器被觸發,或者Ajax異步請求)后,這些事件的回調函數將排在執行隊 列的最后等待執行(實際上,排隊的方式根據瀏覽器的不同而不同,所以這里只是一個簡化);

從第一個JavaScript執行塊開始研究,在第一個執行塊中兩個計時器被初始化:一個10ms的setTimeout()和一個10ms的setInterval()。 依據何時何地計時器被初始化(計時器初始化完畢后就會開始計時),計時器實際上會在第一個代碼塊執行完畢前被觸發。但是,計時器上綁定的函數不會立即執行 (不被立即執行的原因是JavaScript是單線程的)。實際上,被延遲的函數將依次排在執行隊列的最后,等待下一次恰當的時間再執行。

此外,在第一個JavaScript執行塊中我們看到了一個“鼠標點擊”事件發生了。一個JavaScript回調函數綁定在這個異步事件上了(我 們從來不知道用戶什么時候執行這個(點擊)事件,因此認為它是異步的),這個函數不會被立即執行,和上面的計時器一樣,它將排在執行隊列的最后,等待下一 次恰當的時候執行。

當第一個JavaScript執行塊執行完畢后,瀏覽器會立即問一個問題:哪個函數(語句)在等待被執行?在這時,一個“鼠標點擊事件處理函數”和 一個“計時器回調函數”都在等待執行。瀏覽器會選擇一個(實際上選擇了“鼠標點擊事件的處理函數”,因為由圖可知它是先進隊的)立即執行。而“計時器回調 函數”將等待下次適合的時間執行。

注意,當“鼠標點擊事件處理函數”執行的時候,setInterval的回調函數第一次被觸發了。和setTimeout的回調函數一樣,它將排到執行隊列的最后等待執行。但是,一定要注意這一點:當setInterval回調函數第二次被觸發時(此時setTimeout函數仍在執行)setInterval的第一次觸發將被拋棄掉。當一個很長的代碼塊在執行時,可能把所有的setInterval回調函數都排在執行隊列的后面,代碼塊執行完之后,結果便會是一大串的setInterval回調函數等待執行,并且這些函數之間沒有間隔,直到全部完成。所以,瀏覽器傾向于的當沒有更多interval的處理函數在排隊時再將下一個處理函數排到隊尾(這是由于間隔的問題)。

我們能夠發現,當第三個setInterval回調函數被觸發時,之前的setInterval回調函數仍在執行。這就說明了一個很重要的事實:setInterval不會考慮當前正在執行什么,而把所有的堵塞的函數排到隊列尾部。這意味著兩次setInterval回調函數之間的時間間隔會被犧牲掉(縮減)。

最后,當第二個setInterval回調函數執行完畢后,我們可以看到沒有任何程序等待JavaScript引擎執行了。這就意味著瀏覽器現在在等待一個新的異步事件的發生。在50ms時一個新的setInterval回調函數再次被觸發,這時,沒有任何的執行塊阻塞它的執行了。所以它會立刻被執行。

讓我們用一個例子來闡明setTimeout和setInterval之間的區別:

 setTimeout ( function ( ) {    /* Some long block of code... */   setTimeout (arguments. callee, 10 );   }, 10 );    setInterval ( function ( ) {    /* Some long block of code... */   }, 10 ); 

這兩句代碼乍一看沒什么差別,但是它們是不同的。setTimeout回調函數的執行和上一次執行之間的間隔至少有10ms(可能會更多,但不會少于10ms),而setInterval的回調函數將嘗試每隔10ms執行一次,不論上次是否執行完畢。

在這里我們學到了很多知識,總結一下:

JavaScript引擎是單線程的,強制所有的異步事件排隊等待執行
setTimeout 和 setInterval 在執行異步代碼的時候有著根本的不同
如果一個計時器被阻塞而不能立即執行,它將延遲執行直到下一次可能執行的時間點才被執行(比期望的時間間隔要長些)
如果setInterval回調函數的執行時間將足夠長(比指定的時間間隔長),它們將連續執行并且彼此之間沒有時間間隔。

以上所述就是本文的全部內容了,希望能夠對大家學習javascript異步處理有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久久三级| 欧美肥老太性生活视频| 最近中文字幕2019免费| 91精品国产91久久久久福利| 亚洲日本中文字幕免费在线不卡| 97精品一区二区三区| 欧美日韩国产一区中文午夜| 免费成人高清视频| 中文字幕综合一区| 成人免费大片黄在线播放| 亚洲国产精彩中文乱码av在线播放| 国产亚洲激情视频在线| 中文字幕亚洲一区二区三区| 51视频国产精品一区二区| 欧美极品第一页| 欧美贵妇videos办公室| 国产成人在线精品| 亚洲跨种族黑人xxx| 日韩电影网在线| 国产乱肥老妇国产一区二| 国产区亚洲区欧美区| 中文字幕亚洲第一| 日韩中文字幕免费| 欧美www在线| 欧美一级电影在线| 久久理论片午夜琪琪电影网| 亚洲男人天堂手机在线| 亚洲激情在线观看视频免费| 日韩精品中文字幕在线| 欧美中在线观看| 欧美亚洲另类在线| 国内精品一区二区三区四区| 91av成人在线| 日韩精品中文字幕视频在线| 久久精品久久久久久国产 免费| 日韩视频免费中文字幕| 国产精品福利在线观看| 91国自产精品中文字幕亚洲| 欧美日韩美女视频| 亚洲视频在线观看免费| 国产精品免费小视频| 26uuu另类亚洲欧美日本一| 色婷婷久久一区二区| 2019国产精品自在线拍国产不卡| 日韩国产精品亚洲а∨天堂免| 国产成人一区二区在线| 中文字幕在线观看日韩| 亚洲高清久久网| 91av视频导航| 国产精品久久久av久久久| 欧美成人精品一区二区三区| 亚洲综合社区网| 国产香蕉一区二区三区在线视频| 全球成人中文在线| 国产91精品久久久久| 欧美成人中文字幕在线| 国产精品视频精品视频| 美女黄色丝袜一区| 久久久亚洲精品视频| 亚洲精品www久久久久久广东| 国产欧美久久一区二区| 亚洲天堂男人天堂| 国产精品99一区| 久久久91精品国产| 日韩欧美在线视频观看| 81精品国产乱码久久久久久| 国产精品揄拍一区二区| 高清亚洲成在人网站天堂| 亚洲人精品午夜在线观看| 亚洲色图17p| 成人a级免费视频| 国产精品久久97| 亚洲精品欧美日韩| 国产成人av网| 中文字幕亚洲无线码a| 91精品国产乱码久久久久久久久| 91精品久久久久久久久中文字幕| 久久亚洲国产精品| 色天天综合狠狠色| 亚洲福利在线看| 亚洲v日韩v综合v精品v| 日韩精品视频免费| 91精品综合久久久久久五月天| 亚洲小视频在线观看| 亚洲色图五月天| 久久久久久久999精品视频| 亚洲精品国产精品国自产在线| 欧美久久精品一级黑人c片| 最新69国产成人精品视频免费| 久久久欧美一区二区| 91精品国产91久久久久久吃药| 成人国产精品免费视频| 国产精品9999| 欧美一区二区.| 中文字幕亚洲无线码在线一区| 欧美精品videossex88| 欧美激情精品久久久久久久变态| 欧美日韩在线视频一区二区| 精品偷拍各种wc美女嘘嘘| 国产一区二区三区直播精品电影| 欧美高清videos高潮hd| 国产日韩欧美一二三区| 亚洲第一中文字幕在线观看| 国内揄拍国内精品| 国产偷国产偷亚洲清高网站| 欧美伊久线香蕉线新在线| 国产精品久久久久久久久久三级| 亚洲欧美变态国产另类| 国产成人精品免高潮在线观看| 欧美日韩精品在线| 国产日韩精品一区二区| 欧美与黑人午夜性猛交久久久| 欧美激情乱人伦一区| 欧美性高潮在线| 亚洲福利视频专区| 97在线精品国自产拍中文| 清纯唯美日韩制服另类| 亚洲女在线观看| 欧美性受xxx| 国产欧美va欧美va香蕉在| 亚洲人成在线免费观看| 91色视频在线导航| 亚洲国产一区二区三区在线观看| 色悠悠国产精品| 青青在线视频一区二区三区| 欧美极品少妇全裸体| 亚洲国产天堂久久国产91| 欧美日韩另类视频| 美女性感视频久久久| 成人在线中文字幕| 亚洲电影免费观看| 久久黄色av网站| 九九精品在线视频| 国产精品久久久久久久久久久久久久| 成人日韩在线电影| 久久久久久国产精品美女| 亚洲区一区二区| 中文字幕亚洲一区二区三区| 日韩精品电影网| 日韩成人av一区| 欧亚精品在线观看| 国产99视频精品免视看7| 在线丨暗呦小u女国产精品| 欧美成在线观看| 在线观看欧美www| 欧美午夜精品在线| 欧美日韩午夜激情| 成人啪啪免费看| 国产91色在线| 亚洲aⅴ男人的天堂在线观看| 成人午夜小视频| 黑人巨大精品欧美一区二区免费| 欧美精品激情在线| 日韩欧美在线视频免费观看| 久久久噜噜噜久久中文字免| 深夜成人在线观看| 久久色精品视频| 国产亚洲欧洲黄色| 日韩欧美aaa| 中文字幕在线国产精品| 国产免费观看久久黄| 中文字幕日韩av| 亚洲视频精品在线| 欧美性视频精品|