在js的对象中使用setTimeout和setInterval调用对象自身方法
2009-08-03 16:25
911 查看
在js的对象中使用setTimeout和setInterval调用对象自身方法
function myobj(){
this.id=myobj.names.length;
myobj.names[this.id]=this;
}
myobj.names=new Array();
myobj.prototype.am=function (){
alert(this.id);
}
myobj.prototype.bm=function(){
setTimeout("myobj.names['"+this.id+"'].am();",3000);
}
var a=new myobj();
var b=new myobj();
var c=new myobj();
a.bm();
b.bm();
c.bm();
setTimeout和setInterval方法中使用参数
function fu(nn)
{
window.setInterval("test('"+nn+"')", 1000);
}
在js的对象中使用setTimeout和setInterval调用对象自身的方法是个困扰了我时间的问题,真实想的很简单:
setTimeout("this.mythod1();",3000);
岂知用起来不行,究其原因是setTimout是在全局范围内调用引号内的方法的,而在全局范围内this是无法使用的。
想了个土办法,在生成对象时要求将对象名作为构造函数的一个参数,这样就可以在setTimeout或setInterval中使用这个参数调用:
function myobj(objName){
this.Name=objName;
......
}
myobj.prototype.mythod1(){
......
setTimeout(this.Name+".mythod1();",3000);
}
但是总觉得这个办法有点笨,不像高手用的办法。
后来一个同事在网上找到篇文章(不好意思,记不得是哪个老兄的文章了),用了一个巧妙得多的方法:在对象内部随机生成一个唯一的字符串,将这个字符串赋给对象的属性,利用eval方法将this赋给以这个字符串为变量名的变量,由于eval的特性,那个变量是个全局变量,因此可以用这个全局变量作为setTimeout的参数,而这个变量名可以由对象的属性来引用,可以在setTimeout中用对象的属性与这个变量关联,具体代码如下:
function myobj(){
this.sid="myobj"+parseInt(Math.Random()*100000);
eval(this.sid+"=this");
......
}
myobj.prototype.mythod1(){
...
setTimeout(this.sid+".mythod1();",3000);
}
这个方法虽然巧妙,我还是不太满足,还是觉得可以再改进:利用上一篇 js中利用函数的属性模拟命名空间 中的思想,想出了一个办法,示例如下:
function myobj(){
this.id=myobj.names.length;
myobj.names[this.id]=this;
}
myobj.names=new Array();
myobj.prototype.am=function (){
alert(this.id);
}
myobj.prototype.bm=function(){
setTimeout("myobj.names['"+this.id+"'].am();",3000);
}
var a=new myobj();
var b=new myobj();
var c=new myobj();
a.bm();
b.bm();
c.bm();
如果是 window.setInterval("test(nn)", 1000); 会提示nn未定义.
window.setInterval("test('nn')", 1000);弹出的内容却是 nn
直接用 "test(nn)"不行,是因为作用域问题,在 setTimeout执行的时候,只有全局变量可以访问
所以用了一个折衷的办法,假设 nn="hutia"
那么
"test('"+nn+"')" = "test('hutia')"
实际执行的时候就变成了 test('hutia')
function myobj(){
this.id=myobj.names.length;
myobj.names[this.id]=this;
}
myobj.names=new Array();
myobj.prototype.am=function (){
alert(this.id);
}
myobj.prototype.bm=function(){
setTimeout("myobj.names['"+this.id+"'].am();",3000);
}
var a=new myobj();
var b=new myobj();
var c=new myobj();
a.bm();
b.bm();
c.bm();
setTimeout和setInterval方法中使用参数
function fu(nn)
{
window.setInterval("test('"+nn+"')", 1000);
}
在js的对象中使用setTimeout和setInterval调用对象自身的方法是个困扰了我时间的问题,真实想的很简单:
setTimeout("this.mythod1();",3000);
岂知用起来不行,究其原因是setTimout是在全局范围内调用引号内的方法的,而在全局范围内this是无法使用的。
想了个土办法,在生成对象时要求将对象名作为构造函数的一个参数,这样就可以在setTimeout或setInterval中使用这个参数调用:
function myobj(objName){
this.Name=objName;
......
}
myobj.prototype.mythod1(){
......
setTimeout(this.Name+".mythod1();",3000);
}
但是总觉得这个办法有点笨,不像高手用的办法。
后来一个同事在网上找到篇文章(不好意思,记不得是哪个老兄的文章了),用了一个巧妙得多的方法:在对象内部随机生成一个唯一的字符串,将这个字符串赋给对象的属性,利用eval方法将this赋给以这个字符串为变量名的变量,由于eval的特性,那个变量是个全局变量,因此可以用这个全局变量作为setTimeout的参数,而这个变量名可以由对象的属性来引用,可以在setTimeout中用对象的属性与这个变量关联,具体代码如下:
function myobj(){
this.sid="myobj"+parseInt(Math.Random()*100000);
eval(this.sid+"=this");
......
}
myobj.prototype.mythod1(){
...
setTimeout(this.sid+".mythod1();",3000);
}
这个方法虽然巧妙,我还是不太满足,还是觉得可以再改进:利用上一篇 js中利用函数的属性模拟命名空间 中的思想,想出了一个办法,示例如下:
function myobj(){
this.id=myobj.names.length;
myobj.names[this.id]=this;
}
myobj.names=new Array();
myobj.prototype.am=function (){
alert(this.id);
}
myobj.prototype.bm=function(){
setTimeout("myobj.names['"+this.id+"'].am();",3000);
}
var a=new myobj();
var b=new myobj();
var c=new myobj();
a.bm();
b.bm();
c.bm();
如果是 window.setInterval("test(nn)", 1000); 会提示nn未定义.
window.setInterval("test('nn')", 1000);弹出的内容却是 nn
直接用 "test(nn)"不行,是因为作用域问题,在 setTimeout执行的时候,只有全局变量可以访问
所以用了一个折衷的办法,假设 nn="hutia"
那么
"test('"+nn+"')" = "test('hutia')"
实际执行的时候就变成了 test('hutia')
相关文章推荐
- js里的setTimeout和setInterval之后的页面是空白,阻塞浏览器的document对象,但是不阻塞script方法
- js中使用setInterval方法只调用一次而没有循环调用
- 使用MVC中的HtmlHelper对象的ActionLink方法,实现一个Javascript:void(0)效果,去调用一个JS方法
- 让JS中settimeout、setInterval调用传递参数 的好方法
- 快速掌握Node.js中setTimeout和setInterval的使用方法
- js学习--浏览器对象计时器setInterval()与setTimeout()的使用与区别
- Jquery中使用setInterval和setTimeout会提示缺少对象的错误,解决方法如下:
- JS中setTimeout()的使用方法具体解释
- 2011/06/13 android使用html做UI的方法---js与java的相互调用
- js中 setTimeout和setInterval的使用
- 开发日志:onclick调用js方法传递多个使用struts标签获取的参数
- node.js---koa框架,mysql查询后Promise对象使用方法返回json对象。
- a 中调用js的几种方法整理及使用推荐
- JavaScript SetInterval与setTimeout使用方法详解
- Js中使用hasOwnProperty方法检索ajax响应对象的例子
- js中String类型对象的方法使用
- js对象中原型(prototype)的使用方法、替换以及注意事项
- IOS-29-Hybrid混合开发(一):OC调用JS的方法的使用:stringByEvaluatingJavaScriptFromString
- HTML中使用JS调用Silverlight中定义的方法
- js中settimeout方法加参数的使用实例