javascript
javascript中setTimeout()函数
javascript中setTimeout()函數(shù)
?
?
大家都知道javascript中的setTimeput()函數(shù)的作用,一般會(huì)用他來處理一些連續(xù)的事情,們先看一個(gè)例子:
<head>????<script>
????????function?init()
????????{
????????????setTimeout("init2()",0);
????????????alert("1");
????????}
????????function?init2()
????????{
????????????alert("2");
????????}
????</script>
</head>
<body?onload="init()">
</body>?
也許很多人認(rèn)為結(jié)果是:2 1, 而恰恰結(jié)果是:1? 2 。這是為什么呢?明明延遲時(shí)間設(shè)置的是0,應(yīng)該是立刻先執(zhí)行init2()啊?我們可以這樣認(rèn)為,setTimeout()函數(shù)會(huì)自己重新申請(qǐng)一個(gè)堆棧空間,而不屬于當(dāng)前函數(shù)init()的堆棧空間,所以init()先入棧,alert("1")第2個(gè)入棧,當(dāng)init()函數(shù)執(zhí)行完后,setTimeout()才執(zhí)行。
?
當(dāng)然這里沒有涉及到參數(shù)傳遞,再看這個(gè)例子:
<script>
??var?rgbcolor=new?Array(3);
??var?whichtr=0;
??function?changeColor(wh)
??{
??whichtr=wh;
??for(var?i=0;i<3;i++)
??{rgbcolor[i]=Math.ceil(Math.random()*255);}
??trID[whichtr].style.backgroundColor="rgb("+rgbcolor[0]+","+rgbcolor[1]+","+rgbcolor[2]+")";
??setTimeout("changeColor("+whichtr+")",1000);
??}
??
</script>
</head>?<body>
<table?border="1"?height="400"?width="500"?align="center"?cellspacing="0">
??<tr?onmousedown="changeColor(0)"?id="trID"><td>0</td></tr>
??<tr?onmousedown="changeColor(1)"?id="trID"><td>1</td></tr>
??<tr?onmousedown="changeColor(2)"?id="trID"><td>2</td></tr>
</table>
</body>
?
當(dāng)我們?cè)诒砀窭锓謩e單擊3個(gè)行的后,3個(gè)行的背景顏色會(huì)分別一直變顏色.這里我們就會(huì)要問:當(dāng)我點(diǎn)擊第一行后,whichtr=wh=0;當(dāng)我們點(diǎn)擊第2行后,whichtr=wh=1;此時(shí)whichter全局變量已經(jīng)發(fā)生變化了,但此時(shí)第一行的顏色還在變化,點(diǎn)擊第3行后,前面兩行的顏色也一直變化,這是為什么呢?全局變量只有一個(gè)whichtr,可是他明明在我們單擊后就改變了,但是3行的顏色一直變化,我們所期待的應(yīng)該是每次點(diǎn)擊后只有一行的顏色在改變。
為了看的更清楚的知道全局變量whichtr在程序運(yùn)行的時(shí)變化,我們加入一句代碼:document.body.innerHTML+=whichtr;
腳本代碼變?yōu)?#xff1a;
??var?rgbcolor=new?Array(3);
??var?whichtr=0;
??function?changeColor(wh)
??{
??whichtr=wh;
??for(var?i=0;i<3;i++)
??{rgbcolor[i]=Math.ceil(Math.random()*255);}
??trID[whichtr].style.backgroundColor="rgb("+rgbcolor[0]+","+rgbcolor[1]+","+rgbcolor[2]+")";
??document.body.innerHTML+=whichtr;
??setTimeout("changeColor("+whichtr+")",1000);
??}
</script>?
?
此時(shí),我在分別單擊表格的三行,結(jié)果是:三上的顏色都在改邊,whichtr的值是:012012012012...
這時(shí),我們可以知道,全局變量發(fā)生了變化,而且一直在變化。
為什么?關(guān)鍵問題是這句代碼:setTimeout("changeColor("+whichtr+")",1000);
我們可以這樣來分析:
當(dāng)單擊第1行后,whichtr的值是0,當(dāng)程序執(zhí)行到setTimeout("changeColor(”+whichtr+")",1000)時(shí),就會(huì)把0當(dāng)作1000MS后執(zhí)行changeColor()函數(shù)的參數(shù).前面我們已經(jīng)知道,setTimeout函數(shù)在內(nèi)存中會(huì)重新申請(qǐng)一個(gè)堆棧來保存要運(yùn)行的函數(shù),所以,此時(shí)的whichtr=1已經(jīng)被保存到另外一個(gè)內(nèi)存單元中了,但這不是本來的whichtr,只能說是一個(gè)whichtr的拷貝,當(dāng)1000MS時(shí)間周期到的時(shí)候,就會(huì)把whichtr==1這個(gè)拷貝當(dāng)做參數(shù)傳遞給changeColor(),執(zhí)行到whichtr=wh;時(shí),才真正改邊了whichtr這個(gè)全局變量的值.
程序中每一個(gè)onmousedown事件就會(huì)產(chǎn)生一個(gè)堆棧空間,每一個(gè)堆棧空間內(nèi)都會(huì)有一個(gè)changeColor()函數(shù),但是全局變量whichtr是共有的,每個(gè)堆棧內(nèi)獨(dú)立的運(yùn)行,但這并不是多線程,javascript是單線程的,這只能算一個(gè)模擬多線程吧。
總結(jié):
setTimeout()函數(shù)在傳遞參數(shù)的時(shí)候,是將一個(gè)參數(shù)的拷貝保存在setTimeout()所在的新的堆棧中,時(shí)間周期到的時(shí)候,將這個(gè)拷貝傳遞給調(diào)用函數(shù)。
總結(jié)
以上是生活随笔為你收集整理的javascript中setTimeout()函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在ASP.NET中怎么用SESSION判
- 下一篇: 方丹丹(1981-),女,就职于宁波市智