您的位置:首页 > Web前端 > JavaScript

在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')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: