您的位置:首页 > 其它

setTimeout传参数 传递多个参数的问题

2012-07-04 15:12 211 查看
在javascript编程中常用到setTimeout函数定时执行某函数,可在给函数传参时容易出现问题,这里是自己在工作过程中的总结:

1、采用字符串

setTimeout("start(" + argu + ")",1000)

此方法用于传递字符串,无法传递对象

2、匿名函数

setTimeout(function(){ start(argu)},1000); 调用start函数并传arg参数

字符串、对象都行

3、在有些情况下需在循环中使用,如:

window.onload=function(){

var a=[{id:1},{id:2},{id:3},{id:4}];

for(var i=0;i<3;i++){

setTimeout(function(){start(a[i])},1000);

}

}

function start(obj){ alert(obj.id);}

输出的结果都为 4。因为在一个函数体中,a和i相对于匿名函数是全局的,循环执行完后i=3 ,都执行start(a[3]),所以输出结果相同。

这种情况怎么解决呢,只需把setTimeout封装到一个函数中即可

window.onload=function(){

var a=[{id:1},{id:2},{id:3},{id:4}];

for(var i=0;i<3;i++){

set(a[i]);

}

}

function set(obj){ setTimeout(function(){start(obj)},1000); }

obj和匿名函数在同一作用域,所以在匿名函数中可以直接访问obj,而且每次执行setTimeout时都会产生新的匿名函数体和作用域,所以定时执行匿名函数时调用start并传值就不会出问题了。(此为个人的理解,不一定正确)

function start(obj){ alert(obj.id);}

在网上看到有人封装了一个函数,也可实现该功能

var util={

setTimeout:function(fun, delay) {

if(typeof fun == 'function'){

var argu = Array.prototype.slice.call(arguments,2);

var f = (function(){

fun.apply(null, argu);

}

);

return window.setTimeout(f, delay);

}

return window.setTimeout(fun,delay);

}

}

window.onload=function(){

var a=[{id:1},{id:2},{id:3},{id:4}];

for(var i=0;i<3;i++){

util.setTimeout(start,1000,a[i]);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: