日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript中setTimeout()函数

發布時間:2025/3/15 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript中setTimeout()函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

javascript中setTimeout()函數

?

?

大家都知道javascript中的setTimeput()函數的作用,一般會用他來處理一些連續的事情,們先看一個例子:

<head>
????
<script>
????????
function?init()
????????{
????????????setTimeout(
"init2()",0);
????????????alert(
"1");
????????}
????????
function?init2()
????????{
????????????alert(
"2");
????????}
????
</script>
</head>
<body?onload="init()">
</body>?


也許很多人認為結果是:2 1, 而恰恰結果是:1? 2 。這是為什么呢?明明延遲時間設置的是0,應該是立刻先執行init2()啊?我們可以這樣認為,setTimeout()函數會自己重新申請一個堆棧空間而不屬于當前函數init()的堆棧空間,所以init()先入棧,alert("1")第2個入棧,當init()函數執行完后,setTimeout()才執行。
?
當然這里沒有涉及到參數傳遞,再看這個例子:

<head>
<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>

?

當我們在表格里分別單擊3個行的后,3個行的背景顏色會分別一直變顏色.這里我們就會要問:當我點擊第一行后,whichtr=wh=0;當我們點擊第2行后,whichtr=wh=1;此時whichter全局變量已經發生變化了,但此時第一行的顏色還在變化,點擊第3行后,前面兩行的顏色也一直變化,這是為什么呢?全局變量只有一個whichtr,可是他明明在我們單擊后就改變了,但是3行的顏色一直變化,我們所期待的應該是每次點擊后只有一行的顏色在改變。
為了看的更清楚的知道全局變量whichtr在程序運行的時變化,我們加入一句代碼:document.body.innerHTML+=whichtr;
腳本代碼變為:

<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]+")";
??document.body.innerHTML
+=whichtr;
??setTimeout(
"changeColor("+whichtr+")",1000);
??}
</script>?

?
此時,我在分別單擊表格的三行,結果是:三上的顏色都在改邊,whichtr的值是:012012012012...
這時,我們可以知道,全局變量發生了變化,而且一直在變化。
為什么?關鍵問題是這句代碼:setTimeout("changeColor("+whichtr+")",1000);
我們可以這樣來分析:
  當單擊第1行后,whichtr的值是0,當程序執行到setTimeout("changeColor(”+whichtr+")",1000)時,就會把0當作1000MS后執行changeColor()函數的參數.前面我們已經知道,setTimeout函數在內存中會重新申請一個堆棧來保存要運行的函數,所以,此時的whichtr=1已經被保存到另外一個內存單元中了,但這不是本來的whichtr,只能說是一個whichtr的拷貝,當1000MS時間周期到的時候,就會把whichtr==1這個拷貝當做參數傳遞給changeColor(),執行到whichtr=wh;時,才真正改邊了whichtr這個全局變量的值.
程序中每一個onmousedown事件就會產生一個堆棧空間,每一個堆棧空間內都會有一個changeColor()函數,但是全局變量whichtr是共有的,每個堆棧內獨立的運行,但這并不是多線程,javascript是單線程的,這只能算一個模擬多線程吧。

總結:
  setTimeout()函數在傳遞參數的時候,是將一個參數的拷貝保存在setTimeout()所在的新的堆棧中,時間周期到的時候,將這個拷貝傳遞給調用函數。

總結

以上是生活随笔為你收集整理的javascript中setTimeout()函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。