摘要:因為一次性定時器只執行一次,所以確認需要調用時,不需要去清除。總結使用定時器時優先選用一次性定時器,鏈式調用來實現周期性定時器的效果。注意定時器的任務函數添加進任務隊列和執行順序。
定時器 定時器概念
是程序按指定的時間間隔(反復)自動的執行一項任務
定時器方法屬于window對象
如果在該方法中使用this,this的值在非嚴格模式下返回的是window對象,在嚴格模式下返回的是undefined。
分為一次性定時器和周期性定時器
一次性定時器setTimeout(),接收兩個參數:要執行的代碼和以毫秒表示的時間,只在等待時間到達后執行一次
第一個參數可以是一段包含JavaScript代碼的字符串(和使用eval()方法的字符串相同),也可以是一個函數,建議使用函數作為參數
第二個參數表示等待時間,但需要特別注意的是,經過該段時間后,代碼不一定執行。(定時器執行順序會導致一些問題)
setTimeout(function(){ alert(‘hello world’); },100); //或者 setTimeout(“alert(‘hello world’)”,100);
清除一次性定時器:
setTimeout()方法每次被調用都會返回一個新的數值,連續不重復,作為該方法的唯一標識符,如果需要取消一次性定時器,可以在執行前設置clearTimeout()。
var timeoutId=setTimeout(function(){alert(‘hello world’)},1000); clearTimeout(timeoutId);//在未調用之前清除了定時器
只要在指定的時間之前設置clearTimeout()就可以讓一次性定時器不執行。因為一次性定時器只執行一次,所以確認需要調用時,不需要去清除。
周期性定時器setInterval(),接收的參數類型和一次性定時器相同,按照指定的時間間隔(第二個參數)去重復執行代碼,直到該定時器被取消或頁面被卸載。
清除周期性定時器
var i=0; var timerID=setInterval(function(){ console.log(i); i+=1; if (i>10){clearInterval(timerID)} },100);
同一次性定時器相同,都會返回一個唯一標識符,在該定時器未停止之前,這個唯一標識符是不變的,下次被重新調用,會返回另一個不同的數值。在達到清除條件時,設置clearInterval(),因為周期性定時器會一直執行下去,所以必須設置清除。
定時器與調用隊列瀏覽器是多線程程序,可同時執行多個任務,但,JavaScript是一個單線程的解釋器,一個時刻只能執行一項任務。
為了控制要執行的代碼,就有一個JavaScript任務隊列,這些任務會按它們添加到隊列的順序執行,定時器的任務函數會在前面代碼執行完之后才執行,所以會存在等待時間超過設定的時間的情況。
例子
for(var i=0;i<3;i++){ setTimeout("console.log(i)",0); } //3,3,3
在控制臺中輸入以上代碼,會輸出三個3,原因是當瀏覽器讀到定時器時,只是把任務函數加入了回調隊列,但必須在主程序(for循環)執行完后才會執行,而主程序執行完后,i的值為3,然后調用已經在任務隊列中等待的三個定時器任務函數,則都輸出相同的3。
一次性定時器和周期性定時器的比較 一次性定時器模擬周期性定時器var i=0 setTimeout(function(){ if (i<10){ //設置任務函數執行條件 console.log(i); i+=1; setTimeout(arguments.callee,100);//鏈式調用一次性定時器 } },100)
使用一次性定時器時,不必跟蹤定時器ID,因為每次執行代碼后,如果不再設置另一次調用,定時器就會自動停止。
由于一次性定時器是在當前任務函數執行完之后,才開始執行下一次定時器函數,所以定時器中所設置的間隔時間是從當前任務函數執行完之后開始計算的,這一點和周期性定時器不同。
周期性定時器模擬一次性定時器var timerID=setInterval(function(){ alert("hello world"); clearInterval(timerID); },100);
必須設置定時器清除,否則周期性定時器會一直執行下去。
周期性定時器中的時間間隔是指每隔某段時間就調用一次,而不管每次執行任務函數花費多長時間,如果任務函數執行時間超過了設定的時間間隔,就會發生錯誤。
總結使用定時器時優先選用一次性定時器,鏈式調用setTimeout來實現周期性定時器的效果。
注意定時器的任務函數添加進任務隊列和執行順序。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79848.html
摘要:什么是是一個持久化的協議,改協議定義了一個用以在和建立一個連接。是建立在的基礎上,復用了的握手環節,握手成功后經過協商在走協議格式的數據。 什么是websocket Websocket是一個持久化的協議,改協議定義了一個 API 用以在browser和server建立一個 socket 連接。WebSocket是建立在http的基礎上,復用了HTTP的握手環節,握手成功后經過協商在走W...
摘要:易用穩定,本次想通過對的學習和個人解析,吸收框架的思想和設計知識,加強自己對的認知和理解。當然,筆者能力水平有限,后續的文章如有錯誤,還請指出和諒解。目錄如下后續添加文章都會記錄在此服務啟動過程以及主體設計流程源碼解析 前言 swoole是什么?官網的原話介紹是這樣的: Swoole 使用純 C 語言編寫,提供了 PHP 語言的異步多線程服務器,異步 TCP/UDP 網絡客戶端,異步 ...
摘要:個人而言,這個過程中提綱挈領的兩個詞是元認知和路徑依賴。所謂元認知就是對認知的認知,具體地說,是關于個人自己認知過程的知識和調節這些過程的能力,對思維和學習活動的知識和控制。 Windows Containers 大冒險: 啟程 開場白 雖然本系列文章主要是介紹和Windows Containers的相關知識和問題處理思路,但是在討論技術的之前還是想把個人十年的工作經驗做一個簡單的梳理...
摘要:一科技企業做基礎科研的意義計算科學基礎研究關于計算機的基礎理論計算科學用計算解決科學中無法解決的難題。在微軟研究院的游學中,研究院產品演示方面更聚焦在生命科學上,可能也是因為疫情,讓更多科技行業開始對生命醫療進行探索。 2021-11-24,CSDN組織了《新程序員》的讀者福利活動走進名企—...
閱讀 1891·2021-11-24 09:39
閱讀 2535·2021-10-14 09:43
閱讀 3318·2021-10-08 10:10
閱讀 2266·2021-09-22 15:54
閱讀 2340·2019-08-29 17:20
閱讀 1573·2019-08-28 18:14
閱讀 2374·2019-08-26 13:28
閱讀 1111·2019-08-26 12:16