window.setTimeout和window.setInterval不能延时调用

来源:互联网 发布:vb断点调试 编辑:程序博客网 时间:2024/06/05 05:24

无论是window.setTimeout 还是window.setInterval,在使用函数名作为调用句柄时都不能带参数,

而在许多场合必需要带参数,如果企图使用以下语句来使hello函数延迟3 秒执行是不可行的:

window.setTimeout(hello(123),3000);
这将使hello函数立即执行,并将返回值作为调用句柄传递给setTimeout 函数,其结果并不是程序需要的。

而使用字符串形式可以达到想要的结果:
window.setTimeout("hello(123)",3000);
归之 就是函数要以字符串形式传进去


另外我们常常会遇到一种情况,setTimeout(code,millisec)中code包含形参。


例如:我们需要在1秒后向用户提示的信息存储于变量msg中,varmsg='1shaspassed!';

此时不论是直接执行
setTimeout(alert(msg),1000);     //alert(msg)会被立即执行
还是
setTimeout(“alert(msg)”,1000);  //系统报错msgisnotdefined(chrome)

都不能达到预期的目的,因为定时器会努力地将code转化为一个function对象,

第一个错例里定时器立即执行code希求返回一个function对象,结果扑了空;

第二个虽然成功封装出function对象,但是定时器在msg的可见域外执行code,所以msg得不到正确的传递

推荐的解决办法是使用匿名函数回调
varmsg='1shaspassed!';
setTimeout( function(){ alert(msg); },1000);
第一个参数传递了一个会调用所需语句的function对象,这样就解决了code带参的问题。


0 0
原创粉丝点击