[ js ] 用setTimeout 倒數

看板Ajax作者 (薯)時間13年前 (2012/10/20 22:14), 編輯推噓3(3010)
留言13則, 4人參與, 最新討論串1/1
我是JS新手,希望各位不吝指教 我程式希望能夠倒數5 4 3 2 1 0 感覺可以用setTimeout 可是程式跑的時候他沒有按照時間在倒數 而是在一瞬間倒數完 下列式程式碼 <html><head> <script> var i=5 ; function test(){ if (i >=0){ document.write("still have "+i+" seconds."+"<br>"); i--; setTimeout(test() , 1000); } } setTimeout(test() , 1000); </script> </head><body> </body></html> 請問哪裡出了問題呢? 謝謝 -- If a child on the street who has nothing is willing to share, why are we who have everything still so greedy? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 106.1.105.148

10/20 22:21, , 1F
test() 用雙引號包
10/20 22:21, 1F

10/20 22:23, , 2F
直接去掉()就可以了 setTimeout(test, 1000);
10/20 22:23, 2F

10/20 22:24, , 3F
改成 setTimeout(test, 1000);
10/20 22:24, 3F

10/20 22:24, , 4F
第一個參數可以傳入function物件 你加上括號會造成他直接
10/20 22:24, 4F

10/20 22:24, , 5F
執行該function
10/20 22:24, 5F
原來如此,那我想請問一下兩個問題: 1.為什麼setTimeout執行函數允許兩種寫法? setTimeout(test, 1000); setTimeout("test()", 1000); 還有我看網路上有人說第一個參數一定要加分號 setTimeout("test();", 1000); 兩種寫法都能跑 請問這裡又是怎麼回事@.@? 2.這個程式跑的時候 5秒 -> 4秒 的時候會覆蓋 可是接下來卻不會覆蓋 請問是為什麼呢?? 感謝 ※ 編輯: liu2007 來自: 106.1.105.148 (10/20 22:52)

10/20 23:02, , 6F
一個是傳物件進去 一個是類似eval()的作法
10/20 23:02, 6F

10/20 23:03, , 7F
Mozilla Developer Network建議使用傳入物件法 不使用字串
10/20 23:03, 7F

10/20 23:03, , 8F
的原因同eval()
10/20 23:03, 8F

10/20 23:04, , 9F

10/21 02:30, , 10F
不動是因為document.write()呼叫時,頁面已經讀取完成
10/21 02:30, 10F

10/21 02:31, , 11F
你原本的網頁已經被它覆蓋了
10/21 02:31, 11F

10/21 02:31, , 12F
程式也被蓋掉了,所以就變成NPC,毫無反應
10/21 02:31, 12F

10/21 02:33, , 13F
文章代碼(AID): #1GWh7Ud5 (Ajax)