Re: [問題] 關於物件與計時器

看板Ajax作者 (骨頭)時間16年前 (2008/03/06 10:21), 編輯推噓2(204)
留言6則, 2人參與, 最新討論串3/4 (看更多)
※ 引述《awpadam (三瘋)》之銘言: : 請問各位前輩 : 以下,我想重複執行某個物件的某個method : 但是為甚麼程式不是一秒增加一個a,而是瞬間增加無數個a : <html> : <body> : <input id="test" type="text" > : <script> : addtext=function(){ : this.add=function(){ : document.getElementById('test').value+='a'; : setTimeout(this.add(),1000); ^^^^^^^^^ 提醒你一件事情 函數有()表示是執行喔 也就是在add還沒跑完你就又跑一次add() 這時候就形成recursive(遞迴) 所以才會瞬間無限多a 反而你的setTimeout沒有任何意義 (解法是去掉() 把它當成員就ok了) 另外一個問題就是另一位版友回文的scope問題 ̄▽ ̄ 在這一點上我比較傾向用工廠方法的模式來產生物件, 因為this這個關鍵字常常讓人混淆主體。 ──────────────────────────────── <head> <script LANGUAGE="JavaScript">   <!-- addtext=function(str){ var obj={}; obj._str=str; obj._obj=this; obj.add=function(){ document.getElementById('msg').innerHTML+=obj._str; setTimeout( function(){ obj.add(); } ,1000 ); } return obj; } function init(){ var myobj = new addtext("hi"); myobj.add(); var myobj2 = new addtext("hello"); myobj2.add(); } --> </script> </head> <body onload="init();"> <div id="msg"></div> </body> : 雖然正常執行了,不過我的add函式他本身想要的功能就是自己無限的執行 : 而不是必須靠全域使用setInterval : 請問該怎麼解呢? : 再來還有個小問題 : 為甚可以正常執行的那段中的setInterval("myobj.add()",1000); : 如果第一個參數沒有加上雙引號變成字串,是不能執行的呢(難道他用eval在實做?) : 以上 你可以把它看成eval() , 或者你可以參照我的方式來寫function(){}, 只是這樣會製造多餘的function殘渣。 你也可以寫成 myobj.add 因為那裡要傳入的 要嘛就是 evalStr , 要嘛就是 function型態的 variable or member。 -- I am a person, and I am always thinking . Thinking in love , Thinking in life , Thinking in why , Thinking in worth. I can't believe any of what , I am just thinking then thinking , but worst of all , most of mine is thinking not actioning... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.115.77.239

03/06 18:05, , 1F
小推你的回答,大推你的簽名檔
03/06 18:05, 1F

03/06 18:08, , 2F
因為我覺得你的簽名檔應該經過非常多的領悟,才出現的
03/06 18:08, 2F

03/06 19:07, , 3F
再請問一下唷,這個物件有return,那是不是就不用new了呢
03/06 19:07, 3F

03/06 20:47, , 4F
嗯 因為new的過程在function內部已經做了
03/06 20:47, 4F

03/06 20:48, , 5F
在這裡用new是有點多餘的沒錯
03/06 20:48, 5F

03/06 22:38, , 6F
thanks for your answer^^.
03/06 22:38, 6F
文章代碼(AID): #17prL1R3 (Ajax)
討論串 (同標題文章)
文章代碼(AID): #17prL1R3 (Ajax)