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

首頁 > 編程 > JavaScript > 正文

你知道setTimeout是如何運行的嗎?

2019-11-20 09:14:01
字體:
來源:轉載
供稿:網友

大家看下如下代碼,猜猜執行結果:

var start = new Date;setTimeout(function(){ console.log('時間流逝了:'+(new Date - start)+'毫秒');}, 200);while (new Date - start < 1000) {}console.log(1);function doSoming(){ setTimeout(function(){  console.log('時間又流逝了:'+(new Date - start)+'毫秒'); },10);}doSoming();while (new Date - start < 2000) {}console.log(2);

結果是:
約1秒后輸出:1,
再過約1秒后輸出:2,
接著才立即輸出:時間流逝了: 2002 毫秒
最后輸出:時間又流逝了: 2003 毫秒

您猜對了沒?
這里通過setTimeout來延遲執行的函數都被推到最后才執行了;
原理如下:

在現有瀏覽器環境中,Javascript執行引擎是單線程的,主線程的語句和方法,會阻塞定時任務的運行,在Javascript執行引擎之外,存在一個任務隊列,當在代碼中調用setTimeout()方法時,注冊的延時方法會掛到瀏覽器內核其他模塊處理,當延時方法到達觸發條件,即到達設置的延時時間時,該模塊再將要執行的方法添加至該模塊的任務隊列中。這一過程與執行引擎主線程獨立,執行引擎在主線程方法執行完畢,到達空閑狀態時,才會從該模塊的任務隊列中順序提取任務來執行,這期間的時間,可能大于注冊任務時設置的延時時間;

瀏覽器在空閑狀態下,會不斷的嘗試從模塊的任務隊列中提取任務,這稱為事件循環模型;

再回頭看下前面的代碼,第二個setTimeout()的延遲方法的延遲時間是10毫秒,比第一個要早觸發??!為什么執行結果卻在后面?因為它被之前的代碼阻塞了約1000.5~1001毫秒了(視瀏覽器的處理速度),等他掛到處理模塊,等到觸發時間添加進任務隊列時,第一個setTimeout()的延遲方法早就被添加到模塊的任務隊了,而引擎主線程是按順序提取得,所以,你應該懂了吧?

現在,如果把上面的while (new Date - start < 1000) {}改成while (new Date - start < 189) {}或者是while (new Date - start < 190) {},結果又是什么?我就不多說了!各刷新瀏覽器20遍,自己看結果吧!

而setInterval()方法和setTimeout()地位是相同的,調用setInterval()方法時,注冊的延時方法掛到模塊處理,每當觸發時間到達,就往任務隊列添加一次要執行的方法;

下面來具體看看setTimeout的語法: 
var timeID = window.setTimeout(func,delay,[param1,param2,...]); 
var timeID = window.setTimeout(code,delay);
setTimeout和setInterval是Window對象的方法(可省略window),第二個之后的可選參數(IE9及舊版不支持)是傳遞給func的參數,每次調用他們時都會返回一個數字ID(在瀏覽器中打印出來就只是個數字,而本人在webstorm中打印出來發現它實際是一個對象,有很多個屬性),這個ID保持著它對應的setTimeout或setInterval的相關信息,主要用來在中模塊中和任務隊列中清除(或關閉)掉它們(用方法clearTimeout(ID)和clearInterval(ID))。
如果你需要向你的回調函數內傳遞一個參數以下是兼容IE的寫法 

if (document.all && !window.setTimeout.isPolyfill) { var __nativeST__ = window.setTimeout; window.setTimeout = function (vCallback, nDelay, param1, param2,param3) { var aArgs = Array.prototype.slice.call(arguments, 2); return __nativeST__(vCallback instanceof Function ? function () {  vCallback.apply(null, aArgs); } : vCallback, nDelay); }; window.setTimeout.isPolyfill = true;}

一個常見的錯誤出現在循環中使用閉包 

for(var i =0; i <10; i++){ setTimeout(function(){  console.log(i);  },1000);} 

上面的代碼只會輸出數字 10 十次。為什么?閉包! 

當 console.log 被調用的時候,雖然匿名函數保持對外部變量 i 的引用,但此時 for循環已經結束, i 的值被修改成了 10. 

為了得到想要的結果,需要在每次循環中創建變量 i 的拷貝。 

為了正確的獲得循環序號,最好使用 匿名包裹器(其實就是我們通常說的自執行匿名函數)。 

for(var i =0; i <10; i++){ (function(e){  setTimeout(function(){   console.log(e);   },1000); })(i);}

外部的匿名函數會立即執行,并把 i 作為它的參數,此時函數內 e 變量就擁有了 i 的一個拷貝。
 當傳遞給 setTimeout 的匿名函數執行時,它就擁有了對 e 的引用,而這個值是不會被循環改變的。
 有另一個方法完成同樣的工作;那就是從匿名包裝器中返回一個函數。這和上面的代碼效果一樣。 

for(var i =0; i <10; i++){ setTimeout((function(e){  return function(){   console.log(e);  } })(i),1000)}

還有一個重要應用:函數節流(throttle)與函數去抖(debounce)
請看我從網上收集的一些資料:
JavaScript-性能優化之函數節流(throttle)與函數去抖(debounce)

參考鏈接: 
https://developer.mozilla.org/zh-CN/docs/Web/API/Window/setTimeout 
http://www.alloyteam.com/2015/10/turning-to-javascript-series-from-settimeout-said-the-event-loop-model/#prettyPhoto

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩福利电影| 国产精品视频网站| 国产精品久久一区主播| 高清视频欧美一级| 久久成人在线视频| 97视频国产在线| 欧美激情精品久久久久久| 国产精品日韩欧美综合| 欧洲成人在线视频| 亚洲色图综合网| 欧美风情在线观看| 欧美激情亚洲综合一区| 久久久久久综合网天天| 久热99视频在线观看| 日韩视频精品在线| 福利一区福利二区微拍刺激| 国产精品午夜视频| 亚洲视频一区二区| 久久久久国色av免费观看性色| 国产精品第一页在线| 亚洲欧洲美洲在线综合| 浅井舞香一区二区| 欧美性一区二区三区| 久久久久久九九九| 亚洲伦理中文字幕| 日韩三级成人av网| 中文日韩在线观看| 国模精品视频一区二区三区| 欧美一级电影免费在线观看| 日韩欧美国产免费播放| 中文字幕欧美在线| 久久久亚洲影院| 亚洲成人a**站| 97视频在线观看视频免费视频| 一本大道香蕉久在线播放29| 第一福利永久视频精品| 久久777国产线看观看精品| 亚洲一区亚洲二区亚洲三区| 海角国产乱辈乱精品视频| 亚洲精品99999| 日韩亚洲欧美中文在线| 欧美午夜片欧美片在线观看| 亚洲的天堂在线中文字幕| 91影视免费在线观看| 在线视频日韩精品| 国产精品r级在线| 亚洲一区二区免费在线| 欧洲成人在线视频| 亚洲大胆人体视频| 日韩在线观看免费av| 国产精品久久久久久久久久小说| 免费av一区二区| 精品中文字幕久久久久久| 日韩在线观看免费网站| 久久五月天色综合| 欧美性猛交xxxx黑人猛交| 亚洲乱码av中文一区二区| 欧美视频不卡中文| 久99久在线视频| 亚洲精品国产福利| 国产亚洲精品久久| 久久久91精品国产一区不卡| 久久精品久久久久久| 国产精品久久久久久av| 久久综合国产精品台湾中文娱乐网| 亚洲美女在线视频| 中文字幕欧美专区| 91热福利电影| 亚洲欧美变态国产另类| 亚洲伊人一本大道中文字幕| 国产日韩中文字幕| 日韩精品亚洲精品| 欧美成人免费观看| 成人午夜在线视频一区| 国产精品日韩av| 78m国产成人精品视频| 亚洲三级黄色在线观看| 成人黄色大片在线免费观看| 久久久久久伊人| 久久99久久99精品中文字幕| 欧美成人精品影院| 蜜臀久久99精品久久久久久宅男| 色噜噜狠狠狠综合曰曰曰88av| 久久成人精品一区二区三区| 亚洲va久久久噜噜噜久久天堂| 最近2019年手机中文字幕| 色伦专区97中文字幕| 97精品国产97久久久久久免费| 久久久久久久久久国产精品| 亚洲精品美女网站| 97超视频免费观看| 亚洲aⅴ日韩av电影在线观看| 亚洲国产精久久久久久| 国产亚洲精品久久| 欧美午夜精品久久久久久久| 中文字幕久热精品在线视频| 亚洲精品短视频| 国产精品99免视看9| 欧美日韩一区二区免费视频| 亚洲一区二区免费在线| 国产精品日韩在线观看| 992tv成人免费视频| 中国人与牲禽动交精品| 日韩av电影手机在线| 最近2019免费中文字幕视频三| 国产中文字幕亚洲| 久久777国产线看观看精品| 久久人人爽人人爽人人片av高请| 岛国精品视频在线播放| 亚洲欧美日韩久久久久久| 久久精品青青大伊人av| 国产大片精品免费永久看nba| 中文字幕一区电影| 性金发美女69hd大尺寸| 国产精品国内视频| 97高清免费视频| 亚洲一区精品电影| 亚洲精品av在线播放| 国产日韩综合一区二区性色av| 亚洲欧美激情精品一区二区| 日韩精品免费在线视频| 欧美精品成人91久久久久久久| 日韩av成人在线| 亚洲精品久久久久中文字幕二区| 久久久久久久香蕉网| 亚洲精品自在久久| 久久色在线播放| 欧美性猛交xxxx乱大交3| 久久久久国产视频| 精品视频在线导航| 色综合视频网站| 欧美成人三级视频网站| 国产噜噜噜噜噜久久久久久久久| 欧美大秀在线观看| 欧美成人网在线| 91国偷自产一区二区三区的观看方式| 久久久久国产精品免费| 国产在线一区二区三区| 九九精品在线视频| 91高清视频在线免费观看| 欧美视频中文在线看| 在线视频一区二区| 国产精品亚洲自拍| xxxx性欧美| 91精品久久久久久| 在线日韩欧美视频| 日韩av大片在线| 91欧美激情另类亚洲| 欧美在线中文字幕| 97婷婷大伊香蕉精品视频| 久久99精品国产99久久6尤物| 亚洲精品aⅴ中文字幕乱码| 国产91精品最新在线播放| 亚洲欧美日韩一区二区三区在线| 在线观看免费高清视频97| 日本国产欧美一区二区三区| 亚洲欧美综合另类中字| 亚洲国产精品电影| 国产精品久久久久久久一区探花| 日本在线精品视频| 久久视频国产精品免费视频在线| 国产精品高潮呻吟视频| 久久久这里只有精品视频| 国产综合在线视频|