引自:http://blog.csdn.net/free_wind22/archive/2008/03/28/2224363.aspx
尝试实现注释部分的 Javascript 代码,可在其他任何地方添加更多
代码(如不能实现,说明一下不能实现的原因):
var Obj = function(msg)...{
this.msg = msg;
this.shout = function()...{
alert(this.msg);
}
this.waitAndShout = function()...{
// 隔五秒钟后执行上面的 shout 方法
}
}
var testObj = new Obj("Hello,World!");
testObj.shout();
坦白的说,之前我并没有在 Javascript 类中使用 setTimeout/setInterval 的经验,所以开始就很草率的认为这是无法实现的。但是经过深思熟虑以后发现是可以实现的。退一步说,隔五秒执行某段语句是非常容易实现的。比如不考虑别的因素,题目中的函数是可以这样写:
this.waitAndShout = function()...{
setTimeout('this.shout()', 5000);
}
在运行以后,谁都会意识到 this 这个变量是无法找到的。但是这是为什么呢,很快就可以意识到,其实 setTimeout/setInterval 是 window 对象的一个方法,所以也可以写成 window.setTimeout/window.setInterval,那么上述的 this.shout() 就非常可以容易理解为什么不能执行了,因为它实际上调用的是 window.shout() 。
知道了原因以后解决起来就非常的容易了,只要将对象绑定到 window 对象下就可以(我对 Javascript 有趣的对象机制感到兴奋)。那么,上述的函数再做一个小的修改:
this.waitAndShout = function() ...{
window.Obj = this;
setTimeout('Obj.shout()', 5000);
}
这样就可以了。实际上
setTimeout('Obj.shout()', 5000);
等价于
window.setTimeout('window.Obj.shout()', 5000);
另一种方法:
var Obj = function(msg)...{
this.msg = msg;
this.shout = function() ...{
alert(this.msg);
this.waitAndShout();
}
var _self = this;
this.waitAndShout = function() ...{
setTimeout(function()...{_self.shout()}, 5000);
}
}
var testObj = new Obj("Hello,World!");
testObj.shout();
改进的另一种方法:
闭包是对的,但要避免循环中产生匿名函数
var Obj = function(msg)...{
this.msg = msg;
var _self=this;
var shout=this.shout = function() ...{
alert(_self.msg);
_self.waitAndShout();
}
this.waitAndShout = function() ...{
setTimeout(shout, 1000);
}
}
var testObj = new Obj("Hello,World!");
testObj.shout();
方法改进:
<script language="javascript">
/**//**//**//*
功能:修改 window.setTimeout,使之可以传递参数和对象参数
使用方法: setTimeout(回调函数,时间,参数1,,参数n)
*/
var __sto = setTimeout;
window.setTimeout = function(callback,timeout,param)...{
var args = Array.prototype.slice.call(arguments,2);
var _cb = function()...{
callback.apply(null,args);
}
__sto(_cb,timeout);
}
///测试代码
function aaaa(a)...{
alert(a);
}
function aaaaa(a,b,c)...{
alert(a + b + c);
}
var a = new Object();
window.setTimeout(aaaa,1000,a);
window.setTimeout(aaaaa,2000,a,6,7);
</script>
尝试实现注释部分的 Javascript 代码,可在其他任何地方添加更多
代码(如不能实现,说明一下不能实现的原因):
var Obj = function(msg)...{
this.msg = msg;
this.shout = function()...{
alert(this.msg);
}
this.waitAndShout = function()...{
// 隔五秒钟后执行上面的 shout 方法
}
}
var testObj = new Obj("Hello,World!");
testObj.shout();
坦白的说,之前我并没有在 Javascript 类中使用 setTimeout/setInterval 的经验,所以开始就很草率的认为这是无法实现的。但是经过深思熟虑以后发现是可以实现的。退一步说,隔五秒执行某段语句是非常容易实现的。比如不考虑别的因素,题目中的函数是可以这样写:
this.waitAndShout = function()...{
setTimeout('this.shout()', 5000);
}
在运行以后,谁都会意识到 this 这个变量是无法找到的。但是这是为什么呢,很快就可以意识到,其实 setTimeout/setInterval 是 window 对象的一个方法,所以也可以写成 window.setTimeout/window.setInterval,那么上述的 this.shout() 就非常可以容易理解为什么不能执行了,因为它实际上调用的是 window.shout() 。
知道了原因以后解决起来就非常的容易了,只要将对象绑定到 window 对象下就可以(我对 Javascript 有趣的对象机制感到兴奋)。那么,上述的函数再做一个小的修改:
this.waitAndShout = function() ...{
window.Obj = this;
setTimeout('Obj.shout()', 5000);
}
这样就可以了。实际上
setTimeout('Obj.shout()', 5000);
等价于
window.setTimeout('window.Obj.shout()', 5000);
另一种方法:
var Obj = function(msg)...{
this.msg = msg;
this.shout = function() ...{
alert(this.msg);
this.waitAndShout();
}
var _self = this;
this.waitAndShout = function() ...{
setTimeout(function()...{_self.shout()}, 5000);
}
}
var testObj = new Obj("Hello,World!");
testObj.shout();
改进的另一种方法:
闭包是对的,但要避免循环中产生匿名函数
var Obj = function(msg)...{
this.msg = msg;
var _self=this;
var shout=this.shout = function() ...{
alert(_self.msg);
_self.waitAndShout();
}
this.waitAndShout = function() ...{
setTimeout(shout, 1000);
}
}
var testObj = new Obj("Hello,World!");
testObj.shout();
方法改进:
<script language="javascript">
/**//**//**//*
功能:修改 window.setTimeout,使之可以传递参数和对象参数
使用方法: setTimeout(回调函数,时间,参数1,,参数n)
*/
var __sto = setTimeout;
window.setTimeout = function(callback,timeout,param)...{
var args = Array.prototype.slice.call(arguments,2);
var _cb = function()...{
callback.apply(null,args);
}
__sto(_cb,timeout);
}
///测试代码
function aaaa(a)...{
alert(a);
}
function aaaaa(a,b,c)...{
alert(a + b + c);
}
var a = new Object();
window.setTimeout(aaaa,1000,a);
window.setTimeout(aaaaa,2000,a,6,7);
</script>