作者TonyQ (骨头)
看板Ajax
标题Re: [问题] 关於物件与计时器
时间Thu Mar 6 10:21:51 2008
※ 引述《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
1F:→ awpadam:小推你的回答,大推你的签名档 03/06 18:05
2F:→ awpadam:因为我觉得你的签名档应该经过非常多的领悟,才出现的 03/06 18:08
3F:推 awpadam:再请问一下唷,这个物件有return,那是不是就不用new了呢 03/06 19:07
4F:→ TonyQ:嗯 因为new的过程在function内部已经做了 03/06 20:47
5F:→ TonyQ:在这里用new是有点多余的没错 03/06 20:48
6F:推 awpadam:thanks for your answer^^. 03/06 22:38