再网上看到了很多关于Array.prototype.slice的使用,如何使用它实现setTimeout带参数的功能。自我感觉虽然有代码的实现,但大都解释的不是很清楚,列举的例子注释的也很少,所以凭自己的理解简单解释一下。
实现setTimeout带参数,需要了解下边的内容.
1.Array数组的slice作用。
slice方法:slice(begin,end)
可从已有的数组中返回选定的元素。如果省略了end参数,则切分的数组包含从start开始到数组结束的所有元素。特别注意的是:它把截取出来的元素形成了一个新的数组。
例如:var array=new Array();
array[0]="a";
array[1]="b";
document.write(array.slice(1)); //输出b
2.arguments参数数组
代表当前或当前调用函数的参数数组,用来引用调用该函数时传递的实际参数。
如:
var getArgu=function(param1,param2)
{
for (var i = 0; i < arguments.length; i++) {
alert(arguments[i]);
}
}
调用即可测试。
3.Array.prototype.slice.call(arguments[,begin][,end])
必须参数说明:arguments,即是当前函数的参数数组。
可选参数:begin起始位置。end结束位置。省略即所有。
下面实现实现setTimeout带参数完整代码。
//声明变量接受方法指针
var sto = setTimeout;
/**
重写setTimeout方法,带三个参数。
参数1:定时调用的函数
参数2:间隔时间
参数3:参数列表可以使多个 param1,param2,......
*/
window.setTimeout = function(callBack, timeout, params) {
//获得当前方法参数数组中从第3个开始到结尾的元素,形成新的数组。
var args = Array.prototype.slice.call(arguments, 2, arguments.length);
//此函数是代理函数,调用真正要执行的方法,同时传参
var _cb = function() {
//调用方法,传入参数列表,熟悉java的人应该能联想到java里的反射调用方法,很相似。
callBack.apply(this, args);
}
//调用定时器,参数一代理方法,参数二时间间隔
sto(_cb,timeout);
}
//测试调用
function sayHi(a, b)
{
alert(a+b);
}
function sayHello(a)
{
alert(a);
}
//调用定时器:
window.setTimeout(sayHi,1000,"沈阳","你好");
window.setTimeout(sayHello,2000,"大家好");
不知道解释的能否理解。可以给点好的建议。谢谢!