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