今天在写验证码倒计时小demo时,用了如下代码:
window.setTimeout(count(num),1000);
这样直接使用将使count函数立即执行,并将返回值传递给setTimeout函数作为参数,其结果并不是真正需要的,所以会出现问题。
方法一
使用字符串形式可以达到想要的结果:
window.setTimeout("count(num)",1000);
这是我以前常用的方法。
但这种写法是将函数包在引号里,有点像字符串,不够直观。
而且有些场合必须使用函数名,于是上网查阅了以下方法:
方法二
//倒计时函数
function count(_num){
...
}
//创建一个函数,用于返回一个无参数函数
function _count(_num){
return function(){
count(_num);
}
}
//这里30是实参
window.setTimeout(_count(30),1000);
这里定义了一个函数_count,用于接收一个参数,并返回一个不带参数的函数,在这个函数内部使用了外部函数的参数,从而对其调用,不需要使用参数。
在 window.setTimeout函数中,使用_count(30)来返回一个不带参数的函数,此时不需要用引号也实现了参数传递的功能。
其实还可以直接写成:
window.setTimeout(function(){count(30);},1000);
另外也有人通过修改setTimeout、setInterval来实现。即:
方法三
//功能函数
function count(_num){
...
}//*=============================================================
//* 功能: 修改 window.setInterval ,使之可以传递参数和对象参数
//* 方法: setInterval (回调函数,时间,参数1,,参数n) 参数可为对象:如数组等
//*=============================================================
var __sto = setInterval;
window.setInterval = function(callback,timeout,param){
var args = Array.prototype.slice.call(arguments,2);
var _cb = function(){
callback.apply(null,args);
}
__sto(_cb,timeout);
}
//这里参数就变成了(函数名,间隔时间,原函数需要的实参)
window.setInterval(count,1000,30);
此方法实际将原函数的参数数组改造了一下,看懂还是比较容易,先摘抄过来以备不时之用。