javascript
JS中的间歇(周期)调用setInterval()与超时(延迟)调用setTimeout()相关总结
超時(shí)調(diào)用需要使用window.setTimeout(code,millisec)方法
它接受兩個(gè)參數(shù):要執(zhí)行的代碼和以毫秒表示的時(shí)間(即在執(zhí)行代碼前需要等待多少毫秒)。其中第一個(gè)參數(shù)可以是一個(gè)包含JS代碼的字符串(就和在eval()函數(shù)中使用的字符串一樣),也可以是一個(gè)函數(shù)。第二個(gè)參數(shù)表示等待多長(zhǎng)時(shí)間的毫秒數(shù),但經(jīng)過(guò)該事件后指定的代碼不一定會(huì)執(zhí)行。
這是因?yàn)镴S是一個(gè)單線程序的解釋器,一定時(shí)間內(nèi)只能執(zhí)行一段代碼,為了控制要執(zhí)行的代碼就有一個(gè)JS任務(wù)隊(duì)列,這些任務(wù)會(huì)按照將他們添加到隊(duì)列的順序執(zhí)行。
setTimeout()的第二個(gè)參數(shù)告訴JS再過(guò)多長(zhǎng)時(shí)間把當(dāng)前任務(wù)添加到隊(duì)列中。若隊(duì)列為空,這段添加的代碼會(huì)立即執(zhí)行,若不為空,就要等前面的代碼執(zhí)行完再執(zhí)行。
//不建議傳遞字符串!可能會(huì)導(dǎo)致性能損失 setimeout("alert('hellow world!')",1000); //推薦以匿名函數(shù)調(diào)用方式 var timeoutId = setTimeout(function(){alert("hellow world!"); },1000);clearTimeout(timeoutId);調(diào)用setTimeout()之后,該方法會(huì)返回一個(gè)數(shù)值ID,ID是計(jì)劃執(zhí)行代碼的唯一標(biāo)示符,可以通過(guò)clearTimeout(ID)來(lái)取消未執(zhí)行的超時(shí)調(diào)用.
setTimeout() 只執(zhí)行 code 一次。如果要多次調(diào)用,請(qǐng)使用 setInterval() 或者讓 code 自身再次調(diào)用 setTimeout()。
間歇調(diào)用的方法是setInterval(),接受的第一個(gè)參數(shù)是要調(diào)用的函數(shù)或要執(zhí)行的代碼串。,第二個(gè)參數(shù)是周期性執(zhí)行或調(diào)用 code 之間的時(shí)間間隔,以毫秒計(jì)。
調(diào)用setInterval()方法同樣會(huì)返回一個(gè)ID,該ID可用于在將來(lái)某個(gè)時(shí)刻取消間歇調(diào)用。取消間歇調(diào)用的重要性要遠(yuǎn)遠(yuǎn)高于取消超時(shí)調(diào)用,因?yàn)樵诓患痈缮娴那闆r下,間歇調(diào)用將會(huì)一直執(zhí)行到頁(yè)面卸載。
var num = 0,max = 10,intervalId = null; function incrementNumber(){num ;if(num = = max){clearInterval(intervalId);alert("Done");} } //以函數(shù)名調(diào)用方式 intervalId = setInterval(incrementNumber,500);在開(kāi)發(fā)環(huán)境中,很少使用真正的間歇調(diào)用,原因是后一個(gè)調(diào)用可能會(huì)在前一個(gè)調(diào)用結(jié)束之前啟動(dòng)(設(shè)置的周期時(shí)間millisec過(guò)短或函數(shù)代碼code執(zhí)行時(shí)間過(guò)長(zhǎng)),所以最好不要使用間歇調(diào)用。
問(wèn)題:?JavaScript中setInterval傳參常見(jiàn)的問(wèn)題(setInterval第一個(gè)參數(shù)加引號(hào)與不加引號(hào)區(qū)別)
function fun() {console.log("1"); }setInterval("fun()",1000);//全局作用域下正常執(zhí)行setInterval(fun(),1000); //調(diào)用函數(shù)正常,setInterval調(diào)用出錯(cuò)setInterval(fun,1000); //正確setInterval(function(){ //匿名函數(shù)調(diào)用console.log("1");})如例子中所示,setInterval 第一個(gè)參數(shù) 可以是函數(shù)名、匿名函數(shù)、函數(shù)的引用以及其他可執(zhí)行代碼。
setInterval("fun()",1000)
這種加引號(hào)的方式就可以理解為 可執(zhí)行代碼??就行eval() 一樣去執(zhí)行第一個(gè)參數(shù),就是對(duì)fun方法的調(diào)用 理所當(dāng)然的彈出 1??一秒鐘間隔,一直執(zhí)行。
setInterval(fun(),1000)
fun() 是對(duì)函數(shù)的直接調(diào)用,也就是說(shuō)當(dāng)setInterval還沒(méi)有開(kāi)始函數(shù)fun就執(zhí)行了。如果這個(gè)函數(shù)沒(méi)有返回值或者返回值不是可執(zhí)行的函數(shù)或者其他的代碼的話,就以上代碼而言只是彈出一個(gè)1之后就停止了,這種方法無(wú)意義。
setInterval(fun,1000)
此時(shí)setInterval的第一個(gè)參數(shù)fun看作參數(shù)為 函數(shù)名或函數(shù)的引用。
我個(gè)人認(rèn)為更推薦以匿名函數(shù)的方式調(diào)用最好。
更多專業(yè)前端知識(shí),請(qǐng)上 【猿2048】www.mk2048.com
總結(jié)
以上是生活随笔為你收集整理的JS中的间歇(周期)调用setInterval()与超时(延迟)调用setTimeout()相关总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js获得页面鼠标位置
- 下一篇: NodeJS学习目录