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