国产高清在线免费观看-国产高清在线免费无码-国产高清在线男人的天堂-国产高清在线视频-国产高清在线视频精品视频-国产高清在线视频伊甸园

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

對JavaScript調用堆棧和setTimeout用法的深入研究

admin
2010年3月24日 21:59 本文熱度 9001
[p]javascript中會經常用到settimeout來推遲一個函數的執行,如:[/p][color=#000000]settimeout([/color][color=#0000ff]function[/color][color=#000000](){alert([/color][color=#000000]"[/color][color=#000000]hello world[/color][color=#000000]"[/color][color=#000000]);},[/color][color=#000000]1000[/color][color=#000000]);[/color] [br]會在執行到這句話后延遲1秒鐘來彈出alert窗口。那么再看這一段: [color=#008080]1[/color] [color=#0000ff]function[/color][color=#000000] a(){[br][/color][color=#008080]2 [/color][color=#000000]settimeout([/color][color=#0000ff]function[/color][color=#000000]() {alert([/color][color=#000000]1[/color][color=#000000])}, [/color][color=#000000]0[/color][color=#000000]);[br][/color][color=#008080]3 [/color][color=#000000]alert([/color][color=#000000]2[/color][color=#000000]);[br][/color][color=#008080]4[/color] [color=#000000]}[br][/color][color=#008080]5[/color] [color=#000000]a();[/color][color=#008080] [/color][color=#008080][/color][color=#000000][/color]
[p]注意這段代碼中的settimeout延遲設為了0,就是延遲0毫秒,貌似是不做任何延遲立刻執行,即1,2。但實際的執行結果確是2,1。為什么?這得從javascript調用堆棧(call stack)和settimeout的功能說起。[/p]
[p]首先,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)脫離了當前函數調用堆棧??聪旅嬉粋€例子:[/p]
[p][/p][color=#000000]<[/color][color=#000000]input name[/color][color=#000000]=[/color][color=#000000]"[/color][color=#000000]input[/color][color=#000000]"[/color][color=#000000] onkeydown[/color][color=#000000]=[/color][color=#000000]"[/color][color=#000000]alert(this.value)[/color][color=#000000]"[/color][color=#000000] type[/color][color=#000000]=[/color][color=#000000]"[/color][color=#000000]text[/color][color=#000000]"[/color][color=#000000] value[/color][color=#000000]=[/color][color=#000000]"[/color][color=#000000]a[/color][color=#000000]"[/color][color=#000000] [/color][color=#000000]/[/color][color=#000000]>[/color]
[p]這樣一段函數意圖是每輸入一個字符就把當前input里的所有字符都alert出來,但實際效果確是alert出按鍵之前的內容。這里,我們就可以利用settimeout(0)來實現。[/p]
[p][/p]
[p][/p][color=#000000]<[/color][color=#000000]input onkeydown[/color][color=#000000]=[/color][color=#000000]"[/color][color=#000000]var me=this; settimeout(function(){alert(me.value)}, 0)[/color][color=#000000]"[/color][color=#000000] name[/color][color=#000000]=[/color][color=#000000]"[/color][color=#000000]input[/color][color=#000000]"[/color][color=#000000] type[/color][color=#000000]=[/color][color=#000000]"[/color][color=#000000]text[/color][color=#000000]"[/color][color=#000000] value[/color][color=#000000]=[/color][color=#000000]"[/color][color=#000000]a[/color][color=#000000]"[/color][color=#000000] [/color][color=#000000]/[/color][color=#000000]>[/color]
[p][/p]
[p][/p]
[p]這樣當onkeydown事件觸發的時候,alert就被放入了下一個調用堆棧,一旦onkeydown事件觸發的堆棧關閉后就開始執行。當然瀏覽器還有個onkeyup事件也可以實現我們的需求。[/p]
[p]這樣的settimeout用法在實際項目中還是會時常遇到。比如瀏覽器會聰明的等到一個函數堆棧結束后才改變dom,如果再這個函數堆棧中把頁面背景先從白色設為紅色,再設回白色,那么瀏覽器會認為dom沒有發生任何改變而忽略這兩句話,因此我們可以通過settimeout把“設回白色”函數加入下一個堆棧,那么就可以確保背景顏色發生過改變了(雖然速度很快可能無法被察覺)。[/p]
[p]總之,settimeout增加了javascript函數調用的靈活性,為函數執行順序的調度提供極大便利。[/p]

該文章在 2010/3/24 21:59:36 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国精品无码一区二区三区在线 | 制服丝袜天堂 | 国产在线精品一区二区三区 | 欧美精品一区二区A片免费 欧美精品一区二区黄A片 | 国产精品美女久久久久av超清 | 亚洲av无码片vr一区二区 | 无码专区人妻系列在线 | 午夜亚洲福利在线老司机 | 欧美日韩国产中文字幕韩国理论 | 欧美日韩不卡视频一区二区三区 | 韩国三级在线观看影院 | 国产欧美亚洲日韩图片 | 亚洲日韩久久综合中文字幕 | 亚洲午夜精品一区二区 | 麻豆精品国产剧情观看 | 日本爽爽爽爽爽爽免费视频 | 国产婷婷久久综合五月欲色扒 | 日韩免费无码一区二区三区 | 日韩毛片免费视频一级特黄 | 欧美成人h在线观看完整版 欧美成人h加勒比海盗 | 国产在线乱子伦 | 免费无码又爽又刺激软件下载直播 | 人成乱码一卡二卡三四卡五卡六卡 | 亚洲av永久中文无码精品 | 大菠萝福利中心app 大尺度很黄很肉的 | 好湿好紧快点再深一点动图 | 久久久人精午夜精国 | 亚洲国产精品悠悠久 | 欧美精品一区二区精品久久 | 亚洲国产精品欧美日韩一区二 | 亚洲v日韩v精品v无码一区二区 | 国产美女一级做a视频免费 国产美女一区二区 | 亚洲永久精品视频 | 国产成人av一区二区 | 办公室制服丝祙在线播放 | 熟妇性ma | 在线观看欧美一区二区三区 | 精品人妻午夜一区二区三区四区 | 红桃av一区二区三区在线无码av | 91香蕉国产在线观看免费永久 | 精品三级网站 |