国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript調用堆棧及setTimeout使用方法深入剖析

2024-05-06 14:19:36
字體:
來源:轉載
供稿:網友
Javascript中會經常用到setTimeout來推遲一個函數的執行,如:
代碼如下:
setTimeout(function(){alert("Hello World");},1000);

會在執行到這句話后延遲1秒鐘來彈出alert窗口。那么再看這一段:
代碼如下:
function a(){
setTimeout(function() {alert(1)}, 0);
alert(2);
}
a();

注意這段代碼中的setTimeout延遲設為了0,就是延遲0毫秒,貌似是不做任何延遲立刻執行,即1,2。但實際的執行結果確是2,1。為什么?這得從Javascript調用堆棧(call stack)和setTimeout的功能說起。

首先,JavaScript是單線程的,即同一時間只執行一條代碼,所以每一個JavaScript代碼執行塊會“阻塞”其它異步事件的執行。其次,和其他的編程語言一樣,Javascript中的函數調用也是通過堆棧實現的。在執行函數a的時候,a先入棧,如果不給alert(1)加setTimeout,那么alert(1)第2個入棧,最后是alert(2)。但現在給alert(1)加上setTimeout后,alert(1)就被加入到了一個新的堆棧中等待,并“盡可能快”的執行。這個盡可能快就是指在a的堆棧完成后就立刻執行,因此實際的執行結果就是先alert(2),再alert(1)。在這里setTimeout實際上是讓alert(1)脫離了當前函數調用堆棧。看下面一個例子:
代碼如下:
<input name="input" onkeydown="alert(this.value)" type="text" value="a" />

這樣一段函數意圖是每輸入一個字符就把當前input里的所有字符都alert出來,但實際效果確是alert出按鍵之前的內容。這里,我們就可以利用setTimeout(0)來實現。
代碼如下:
<input onkeydown="var me=this; setTimeout(function(){alert(me.value)}, 0)" name="input" type="text" value="a" />

這樣當onkeydown事件觸發的時候,alert就被放入了下一個調用堆棧,一旦onkeydown事件觸發的堆棧關閉后就開始執行。當然瀏覽器還有個onkeyup事件也可以實現我們的需求。

這樣的setTimeout用法在實際項目中還是會時常遇到。比如瀏覽器會聰明的等到一個函數堆棧結束后才改變DOM,如果再這個函數堆棧中把頁面背景先從白色設為紅色,再設回白色,那么瀏覽器會認為DOM沒有發生任何改變而忽略這兩句話,因此我們可以通過setTimeout把“設回白色”函數加入下一個堆棧,那么就可以確保背景顏色發生過改變了(雖然速度很快可能無法被察覺)。

總之,setTimeout增加了Javascript函數調用的靈活性,為函數執行順序的調度提供極大便利。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 古交市| 周至县| 营山县| 大悟县| 马山县| 阳西县| 张家川| 新宁县| 西乡县| 靖州| 昌吉市| 麟游县| 阿克| 大竹县| 凭祥市| 长沙市| 东丽区| 嵩明县| 微山县| 两当县| 祁门县| 临泽县| 吉林省| 武陟县| 磐安县| 广东省| 宁夏| 乳源| 禄劝| 朔州市| 孝义市| 平定县| 普洱| 渝中区| 济阳县| 彭水| 墨江| 礼泉县| 平果县| 张家川| 蓬溪县|