在javascript中调用setTimeout的时候,如果我们是无参数的方法,调用相对简单,直接像下面这样调用就可以了
code1 2 3 4 5 6 7 8 9 10 11 12 | function fun(){
}
setTimeout( function (){...}, 100);
setTimeout(fun, 100);
setTimeout( "fun()" , 100);
|
在有参数的时候,如果仅仅是字符串类型,也还好解决,第三种方法为我们提供了依据,可以像下面这样:
code1 2 3 4 5 6 7 8 9 10 11 | function fun1(p){
}
setTimeout( "fun1('parameters')" , 100);
setTimeout( "fun1('" + paramenter + "')" , 100);
|
不过事情并非总是如此顺利,我们有的时候需要传递的是对象(这个需求越来越普遍了)。如果是按照这种传参的方式,结果将不可能是我们想要的。而直接像下面这样使用,你应该会发现,是行不通的:
code1 2 3 4 5 6 7 8 | function fun2(objectP){
}
|
为了能够顺利调用,我们要做一些工作,最简单直接的就是重写setTimeout了,霸王硬上弓:
code1 2 3 4 5 6 7 8 9 10 11 12 13 14 | function fun2(objectP){
}
var $st = window.setTimeout;
window.setTimeout = function (funRef, delayTime) {
if ( typeof funRef === 'function' ) {
var args = Array.prototype.slice.call(arguments,2);
var f = function (){ funRef.apply( null , args); };
return $st(f, delayTime);
}
return $st(funRef,delayTime);
}
|
在代码中我们能看到,为了后继可以使用原生的setTimeout,我们不得不将setTimeout放入到变量中,这样就可以在有必要的时候调用了。这个方法最大的问题是对原生的setTimeout进行了覆盖,如果代码中原有调用了setTimeout,可能就会出现不必要的麻烦了。为此我们需要一种更简单,并且能够更加容易维护的方法。
分析这个方法,最根本就是让setTimeout调用个无参数的方法,因此,我们可以这样:
code1 2 3 4 5 6 7 8 9 10 | function fun2(objectP){
return function (){
}
}
setTimeout(fun2(p), 100);
|
这样,就可以直接在setTimeout中调用了。这样就不会和现有的代码产生冲突,并且,在维护的时候,也能更加的方便。