1
2
3
4
5
6
7
8
|
function?a(s) { ??? alert(s); } setInterval("a()",100); 我想傳遞一個(gè)參數(shù)過(guò)去,怎么弄? 這個(gè)參數(shù)有可能是變量有可能是常數(shù)。 |
setInterval是一個(gè)實(shí)現(xiàn)定時(shí)調(diào)用的函數(shù),可按照指定的周期(以毫秒計(jì))來(lái)調(diào)用函數(shù)或計(jì)算表達(dá)式。setInterval方法會(huì)不停地調(diào)用函數(shù),直到 clearInterval被調(diào)用或窗口被關(guān)閉。
由setInterval返回的ID值可用作clearInterval方法的參數(shù)。
setInterval(function(){a("text")},100);
var?obj=document.getElementById("mydiv");
setInterval(function{a(obj)},100);
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
??? <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">< html xmlns = "http://www.w3.org/1999/xhtml" > < head > ???? < title ></ title > ???? < script type = "text/javascript"> ?????? function fun(){ ???????????? alert(1); ???????? } ?????? setInterval("fun()",1000); //全局作用域下正常執(zhí)行 ?????? setInterval(fun(),1000); //調(diào)用函數(shù)正常,setInterval調(diào)用出錯(cuò) ?????? setInterval(fun,1000);? //正確 ???? </ script > </ head > < body > </ body > </ html > |
? ? 我所給出的代碼和提問(wèn)題人是一樣的,唯一的區(qū)別就是函數(shù)名不同罷了!如果大家做了相關(guān)測(cè)試都應(yīng)該知道,就以上代碼來(lái)說(shuō)都會(huì)彈出結(jié)果1.
當(dāng)然以上代碼其執(zhí)行環(huán)境為全局。setInterval 第一個(gè)參數(shù) 可以是函數(shù)名、匿名函數(shù)、函數(shù)的引用以及其他可執(zhí)行代碼。
1
|
setInterval( "fun()" ,1000); |
其中這種加引號(hào)的調(diào)用就可以理解為 可執(zhí)行代碼??就行eval 一樣去執(zhí)行第一個(gè)參數(shù),就是對(duì)fun方法的調(diào)用 理所當(dāng)然的彈出 1??一秒鐘間隔,一直執(zhí)行。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1
|
setInterval(fun(),1000); |
而這個(gè)調(diào)用我就不理解使用者通過(guò)這種方式使用setInterval 的意圖為何.
fun() 是對(duì)函數(shù)的直接調(diào)用,也就是說(shuō)當(dāng)setInterval還沒(méi)有開(kāi)始函數(shù)func就執(zhí)行了。如果這個(gè)函數(shù)沒(méi)有返回值或者返回值不是可執(zhí)行的函數(shù)或者其他的代碼的話(huà),就以上代碼而言只是彈出1,之后就遍報(bào)錯(cuò)了.
難道這樣的調(diào)用真的不可以嗎?其實(shí)是可以的!例如代碼:
1
2
3
4
5
6
|
?????? function funone() { ?????????? return function () { ???????????? alert( "qishiwoyenengzhixing" ) ?????????? } ?????? } setInterval(funone(), 1000); //你敢說(shuō)我不能執(zhí)行? |
我個(gè)人認(rèn)為這種設(shè)計(jì)或者調(diào)用完全沒(méi)有任何意義,用其他的方法就行了。
--------------------------------------------------------------------------------------------------------------
1
|
setInterval(fun,1000); //這種方法是正確的。 |
大家可以把這種調(diào)用setInterval的第一個(gè)參數(shù)看作參數(shù)為 函數(shù)名或函數(shù)的引用。當(dāng)然我們還可以這樣調(diào)用,使用匿名函數(shù)。
1
2
3
4
|
setInterval( function () { ???????????? alert( "我一秒中執(zhí)行一次" ); ???????? }, 1000) |
---------------------------------------------------------------------------------------------------------------
有些人可能發(fā)現(xiàn),在全局作用域下??setInterval("fun()",1000); 可以正常執(zhí)行,但放到window.onload函數(shù)中卻不能執(zhí)行。為什么呢?
先請(qǐng)看代碼:
1
2
3
4
5
6
7
8
9
|
window.onload = function () { ???????????? function fun() { ???????????????? alert(1); ???????????? } ????????????? setInterval( "fun()" ,1000); //這個(gè)報(bào)錯(cuò)了 未定義?? 重點(diǎn)在這一個(gè) ???????????? // setInterval(fun(), 3000); //這個(gè)和剛才全局的表現(xiàn)一樣 ??????????? // setInterval(fun,1000);//這個(gè)沒(méi)有問(wèn)題 ???????? } |
setInterval("fun()",1000); 這種調(diào)用報(bào)未定義,在全局我們已經(jīng)說(shuō)過(guò)了 。我們可以把帶引號(hào)的參數(shù)理解為 可執(zhí)行代碼 。
而setInterval現(xiàn)在把以引號(hào)包括的可執(zhí)行代碼進(jìn)行處理。就像eval一樣給予執(zhí)行。其在執(zhí)行中 fun() 執(zhí)行環(huán)境發(fā)生了變化,不是在window.onload方法下,而是在全局環(huán)境中也就是window.大家應(yīng)該知道JavaScript存在作用域鏈,由內(nèi)向外依次查找。內(nèi)部可以訪問(wèn)其上層的函數(shù)和變量,而外部卻不能訪問(wèn)內(nèi)部的函數(shù)和變量。JavaScript有一個(gè)預(yù)編譯處理,首先對(duì)函數(shù)和變量進(jìn)行預(yù)編譯。也就是說(shuō)其函數(shù)和變量作用域是在其聲明的時(shí)候確定的,而不是在執(zhí)行的時(shí)候確定。當(dāng)setInterval把"fun()"執(zhí)行環(huán)境換為全局(詳細(xì)見(jiàn):拓展)的后,對(duì)fun的調(diào)用是無(wú)效的。因?yàn)槿植荒茉L問(wèn)局部的函數(shù)和變量。window.onload相對(duì)于window來(lái)說(shuō)就是局部的。
setInterval函數(shù)的ID標(biāo)識(shí),每次調(diào)用setInterval函數(shù)都會(huì)產(chǎn)生一個(gè)唯一的ID,可以通過(guò)clearInterval函數(shù)(此函數(shù)的參數(shù)接收一個(gè)setInterval返回的ID)暫停setInterval函數(shù)
setInterval函數(shù)會(huì)重復(fù)間隔一段時(shí)間執(zhí)行代碼,因此應(yīng)使用clearInterval函數(shù)將其停止,或者頁(yè)面被卸載也會(huì)自動(dòng)停止
var
icolor
=
0
;
var
iNum
=
256
;
var
iID
=
setInterval
(
setbgColor
,
500
)
;
function
setbgColor
(
)
{
document
.
bgColor
=
"
#
"
+
icolor
*
iNum
*
iNum
*
iNum
+
icolor
*
iNum
*
iNum
+
icolor
*
iNum
;
if
(
(
icolor
+=
10
)
>
iNum
)
{
clearInterval
(
iID
)
;
}
}
JavaScript的setInterval()
函數(shù)用于設(shè)定每隔指定的時(shí)間就執(zhí)行對(duì)應(yīng)的函數(shù)或代碼。
該函數(shù)屬于全局對(duì)象window
。
setInterval()
函數(shù)的語(yǔ)法如下:
<span class="pln">setInterval </span><span class="pun">(</span><span class="pln"> code</span><span class="pun">,</span><span class="pln"> milliseconds</span><span class="pun">[,</span><span class="pln"> args</span><span class="pun">...]</span> <span class="pun">)</span>
參數(shù) | 描述 |
code | 需要執(zhí)行的函數(shù)或js代碼 |
milliseconds | 執(zhí)行函數(shù)或代碼的間隔時(shí)間,單位為毫秒 |
args | 可選參數(shù)用于給被調(diào)用的函數(shù)傳遞參數(shù),參數(shù)可以有多個(gè) |
setInterval()
函數(shù)將返回一個(gè)標(biāo)識(shí)符 ID,這個(gè) ID 是唯一的(一般是整數(shù),從 1 開(kāi)始,每調(diào)用一次 setInterval() 就加 1)。
如果需要 setInterval() 執(zhí)行的函數(shù)或代碼尚未執(zhí)行,我們可以通過(guò) clearInterval() 函數(shù)來(lái)取消該執(zhí)行操作,clearInterval() 需要接收一個(gè)參數(shù),這個(gè)參數(shù)就是 setInterval() 返回的標(biāo)識(shí)符ID。
setInterval() 的參數(shù)code
可以直接是一段js腳本。
<span class="com">// 每隔5秒鐘就彈出提示信息"歡迎來(lái)到CodePlayer"。</span><span class="pln"> setInterval</span><span class="pun">(</span><span class="str">'alert("歡迎來(lái)到CodePlayer");'</span><span class="pun">,</span> <span class="lit">5000</span><span class="pun">);</span>
運(yùn)行代碼
參數(shù)code
也可以是一個(gè)函數(shù)調(diào)用。
<span class="kwd">function</span><span class="pln"> sayHi</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">){</span><span class="pln"> ? ? alert</span><span class="pun">(</span><span class="pln">msg</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="com">// 每隔5秒鐘就彈出提示信息"歡迎來(lái)到CodePlayer"。</span><span class="pln"> setInterval</span><span class="pun">(</span><span class="str">'sayHi("歡迎來(lái)到CodePlayer");'</span><span class="pun">,</span> <span class="lit">5000</span><span class="pun">);</span>
如果參數(shù)code
執(zhí)行的是一個(gè)函數(shù)則可以直接使用函數(shù)名稱(chēng)或者匿名函數(shù)作為參數(shù)。如果函數(shù)需要參數(shù),我們可以通過(guò)setInterval()
的可選參數(shù)為其傳遞相應(yīng)的參數(shù)。
<span class="com">//該函數(shù)不需要參數(shù)</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> test</span><span class="pun">(){</span><span class="pln"> ? ? alert</span><span class="pun">(</span><span class="str">"測(cè)試"</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="com">// 每隔5秒鐘就彈出提示信息"測(cè)試"。</span><span class="pln"> setInterval</span><span class="pun">(</span><span class="pln">test</span><span class="pun">,</span> <span class="lit">5000</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 使用匿名函數(shù)作為參數(shù),每隔5秒鐘就輸出控制臺(tái)信息"測(cè)試2"。</span><span class="pln"> setTimeout</span><span class="pun">(</span><span class="kwd">function</span><span class="pun">(){</span><span class="pln"> ? ? console </span><span class="pun">&&</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">"測(cè)試2"</span><span class="pun">);</span><span class="pln"> ? </span><span class="pun">},</span> <span class="lit">5000</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 該函數(shù)需要兩個(gè)參數(shù)</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> sayHello</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> age</span><span class="pun">){</span><span class="pln"> ? ? alert</span><span class="pun">(</span><span class="str">"我叫"</span> <span class="pun">+</span><span class="pln"> name </span><span class="pun">+</span> <span class="str">",今年"</span> <span class="pun">+</span><span class="pln"> age </span><span class="pun">+</span> <span class="str">"歲!"</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="com">//每隔5秒鐘就彈出提示信息"我叫CodePlayer,今年18歲!"。</span><span class="pln"> setInterval</span><span class="pun">(</span><span class="pln">sayHello</span><span class="pun">,</span> <span class="lit">5000</span><span class="pun">,</span> <span class="str">"CodePlayer"</span><span class="pun">,</span> <span class="lit">18</span><span class="pun">);</span>
1,HTML DOM setInterval() 方法
setInterval() 方法可按照指定的周期(以毫秒計(jì))來(lái)調(diào)用函數(shù)或計(jì)算表達(dá)式。
setInterval() 方法會(huì)不停地調(diào)用函數(shù),直到 clearInterval() 被調(diào)用或窗口被關(guān)閉。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的參數(shù)。
setInterval(code,millisec[,"lang"])
參數(shù) | 描述 |
---|---|
code | 必需。要調(diào)用的函數(shù)或要執(zhí)行的代碼串。 |
millisec | 必須。周期性執(zhí)行或調(diào)用 code 之間的時(shí)間間隔,以毫秒計(jì)。 |
一個(gè)可以傳遞給 Window.clearInterval() 從而取消對(duì) code 的周期性執(zhí)行的值。
---------------------------------------------------
2,HTML DOM clearInterval() 方法
clearInterval() 方法可取消由 setInterval() 設(shè)置的 timeout。
clearInterval() 方法的參數(shù)必須是由 setInterval() 返回的 ID 值。
clearInterval(id_of_setinterval)
參數(shù) | 描述 |
---|---|
id_of_setinterval | 由 setInterval() 返回的 ID 值。 |
如何停止:
下面這個(gè)例子將每隔 50 毫秒調(diào)用 clock() 函數(shù)。您也可以使用一個(gè)按鈕來(lái)停止這個(gè) clock:
<html>
<body>
<input type="text" id="clock" size="35" />
<script language=javascript>
var int=self.setInterval("clock()",50)
function clock()
{
var t=new Date()
document.getElementById("clock").value=t
}
</script>
</form>
<button onclick="int=window.clearInterval(int)">
Stop interval</button>
</body>
</html>
--------------------------------------------------------------------------------------------------------
再來(lái)了解 setTimeout :
1,HTML DOM setTimeout() 方法
setTimeout() 方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式。
setTimeout(code,millisec)
參數(shù) | 描述 |
---|---|
code | 必需。要調(diào)用的函數(shù)后要執(zhí)行的 JavaScript 代碼串。 |
millisec | 必需。在執(zhí)行代碼前需等待的毫秒數(shù)。 |
提示:setTimeout() 只執(zhí)行 code 一次。如果要多次調(diào)用,請(qǐng)使用 setInterval() 或者讓 code 自身再次調(diào)用 setTimeout()。
<html> <head> <script type="text/javascript"> function timedMsg() { var t=setTimeout("alert('5 seconds!')",5000) } </script> </head> <body> <form> <input type="button" value="Display timed alertbox!" onClick="timedMsg()"> </form> <p>Click on the button above. An alert box will be displayed after 5 seconds.</p> </body> </html>
-----------------------------
2,HTML DOM clearTimeout() 方法
clearTimeout() 方法可取消由 setTimeout() 方法設(shè)置的 timeout。
clearTimeout(id_of_settimeout)
參數(shù) | 描述 |
---|---|
id_of_setinterval | 由 setTimeout() 返回的 ID 值。該值標(biāo)識(shí)要取消的延遲執(zhí)行代碼塊。 |
下面的例子每秒調(diào)用一次 timedCount() 函數(shù)。您也可以使用一個(gè)按鈕來(lái)終止這個(gè)定時(shí)消息:
<html>
<head>
<script type="text/javascript">
var c=0
var t
function timedCount()
{
document.getElementById('txt').value=c
c=c+1
t=setTimeout("timedCount()",1000)
}
function stopCount()
{
clearTimeout(t)
}
</script>
</head>
<body>
<form>
<input type="button" value="Start count!" onClick="timedCount()">
<input type="text" id="txt">
<input type="button" value="Stop count!" onClick="stopCount()">
</form>
</body>
</html>