日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景

發布時間:2023/12/10 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在今天之前我一直以為setTimeout這個函數是異步的,無意中看到了一篇關于setTimeout的文章。發現自己曾經的認識全是錯誤的,趕緊總結下。


先看一段代碼:

var start = new Date(); setTimeout(function(){var end = new Date();console.log("Time elapsed: ", end - start, "ms"); }, 500);while (new Date - start <= 1000) {}

運行這段腳本能夠看到:Time elapsed的值大概在1001ms左右,肯定會超過1000ms。也就是說:setTimeout失效了,指定的函數并沒有在500ms后運行。而是延遲到1000ms后才運行。


再看一段代碼:

function a() {setTimeout(function(){console.log(1);},0);console.log(2); } a();

執行這段腳本能夠看到:先打印2后打印1,我們在setTimeout里面指定了0ms,希望能馬上執行,可是實際上沒有效果。


想要理解上面的2段代碼,我們得了解一下javascript中setTimeout的實現原理。首先牢記一點:JavaScript 是單線程運行的,也就是無法同一時候運行多段代碼。

以下這段解釋來自這篇博客:

? ? ? ? JavaScript是單線程運行的,無法同一時候運行多段代碼。當某一段代碼正在運行的時候,全部興許的任務都必須等待,形成一個隊列。

一旦當前任務運行完畢,再從隊列中取出下一個任務,這也常被稱為 “堵塞式運行”。所以一次鼠標點擊,或是計時器到達時間點,或是Ajax請求完畢觸發了回調函數。這些事件處理程序或回調函數都不會馬上運行,而是馬上排隊。一旦線程有空暇就運行。假如當前 JavaScript線程正在運行一段非常耗時的代碼,此時發生了一次鼠標點擊。那么事件處理程序就被堵塞。用戶也無法馬上看到反饋。事件處理程序會被放入任務隊列。直到前面的代碼結束以后才會開始運行。假設代碼中設定了一個 setTimeout,那么瀏覽器便會在合適的時間。將代碼插入任務隊列。假設這個時間設為 0,就代表馬上插入隊列,但不是馬上運行。仍然要等待前面代碼運行完成。

所以 setTimeout 并不能保證運行的時間。是否及時運行取決于 JavaScript 線程是擁擠還是空暇。


也就是說setTimeout僅僅能保證在指定的時間過后將任務(須要運行的函數)插入隊列等候,并不保證這個任務在什么時候運行。運行javascript的線程會在空暇的時候,自行從隊列中取出任務然后運行它。javascript通過這樣的隊列機制。給我們制造一個異步運行的假象。

var start = new Date(); setTimeout(function(){var end = new Date();console.log("Time elapsed: ", end - start, "ms"); }, 500);console.log("task finished.");我們之所以會感覺到這段代碼是在異步運行,這是由于javascript線程并沒有由于什么耗時操作而堵塞,所以能夠非常快地取出排隊隊列中的任務然后運行它。

如今我們知道了setTimeout的原理了,如今看下setTimeout(0)的使用場景。以下這個樣例來自這篇文章。

<input type="text" οnkeydοwn="show(this.value)"> <div></div> <script type="text/javascript">function show(val) {document.getElementsByTagName('div')[0].innerHTML = val;} </script>這里綁定了 keydown 事件,意圖是當用戶在文本框里輸入字符時。將輸入的內容實時地在 <div> 中顯示出來。可是實際效果并不是如此,能夠發現。每按下一個字符時,<div> 中僅僅能顯示出之前的內容,無法得到當前的字符。


<input type="text" οnkeydοwn="var self=this; setTimeout(function() {show(self.value)}, 0)"> <div></div> <script type="text/javascript">function show(val) {document.getElementsByTagName('div')[0].innerHTML = val;} </script>

這段代碼使用了setTimeout(0)就能夠實現需要的效果了。

這里事實上涉及2個任務,1個是將鍵盤輸入的字符回寫到輸入框中。一個是獲取文本框的值將其寫入div中。第一個是瀏覽器自身的默認行為。一個是我們自己編寫的代碼。非常顯然。必需要先讓瀏覽器將字符回寫到文本框。然后我們才干獲取其內容寫到div中。改變順序,這這正是setTimeout(0)的作用。


參考文章:setTimeout(0) 的作用


總結

以上是生活随笔為你收集整理的javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: xxav在线| 欧美二区在线 | 别揉我奶头一区二区三区 | 欧美精品性视频 | 中文字幕欲求不满 | 九九热国产精品视频 | 婷婷四房综合激情五月 | 成年人网站在线免费观看 | 天堂资源最新在线 | 久久久一 | 日本一区二区三区视频在线 | 69欧美视频 | 日本天堂在线观看 | 日本少妇吞精囗交视频 | 男男上床视频 | 91黄色免费版 | 国产午夜视频在线播放 | 伊人伊人鲁 | 精品人伦一区二区三区蜜桃网站 | 光棍影院一区二区 | 日韩有码第一页 | 中文黄色片 | 亚洲啪av永久无码精品放毛片 | 国产精品99久久久久 | 综合国产精品 | 久久久精品一区二区涩爱 | 手机在线免费观看av | 久久国产亚洲精品无码 | 天天射综合网站 | 麻豆av一区二区三区在线观看 | 中文字幕1区2区3区 www.com黄色片 | 国产综合无码一区二区色蜜蜜 | 亚洲另类春色 | 在线视频导航 | 久久人人妻人人人人妻性色av | 国产午夜福利视频在线观看 | 日韩mv欧美mv国产网站 | 久久美女精品 | 厨房性猛交hd| 337p粉嫩大胆噜噜噜亚瑟影院 | 国产精品无码专区av在线播放 | 欧美精品色婷婷五月综合 | 玉米地疯狂的吸允她的奶视频 | 国产福利91 | 成人三级在线视频 | 97人妻精品一区二区三区软件 | 黄色av三级 | 性做久久久久久免费观看欧美 | av有码在线观看 | 海角国产乱辈乱精品视频 | 2019中文字幕在线观看 | 反差在线观看免费版全集完整版 | 欧美三级在线观看视频 | 91亚洲网站 | www黄色片网站 | 亚洲国产精品自拍视频 | 丁香花完整视频在线观看 | 欲求不满在线小早川怜子 | 美女高潮黄又色高清视频免费 | 免费看h网站 | 精品国产乱码久久久 | 国产一级片免费在线观看 | 邻居交换做爰2 | 日本精品在线看 | 精品人妻一区二区三区四区五区 | 日韩精品在线免费观看 | 亚洲网在线观看 | 奇米亚洲 | 97综合| 日本在线免费观看 | 国产视频1区 | 日本顶级大片 | 成人午夜剧场视频网站 | 久久99久久99精品免观看粉嫩 | 日韩少妇裸体做爰视频 | 亚洲影视中文字幕 | 丁香色网 | 中文人妻熟女乱又乱精品 | 国产三级全黄 | 琪琪女色窝窝777777 | 在线国产三级 | 免费av一区二区三区 | 成人av电影在线播放 | 国产伦精品一区二区三区在线观看 | 好吊色这里只有精品 | 国产三级aaa | 欧美色就是色 | 黄频在线看 | 国产学生美女无遮拦高潮视频 | 91精品国产综合久久久久 | 男插女视频网站 | 国产精品一区二区在线免费观看 | 91亚洲精品久久久久久久久久久久 | 久久久久99精品成人片 | 女性向小h片资源在线观看 日本天天操 | 久久精品91| 日韩精品一区二区在线看 | 天天躁日日躁aaaaxxxx | 欧洲一区二区在线观看 |