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]);
}
}
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]);
}
}
相关文章推荐
- setTimeout传递带参数的函数问题,jquery获取参数值的问题
- Js中setInterval、setTimeout不能传递参数问题 及各自的关闭方法
- springmvc Jsp页面向后台传递中文参数乱码问题
- AJAX传递汉字参数乱码问题
- 解决jQuery $.getJSON() 传递参数中文乱码问题
- 解决jQuery $.getJSON() 传递参数中文乱码问题
- 解决WCF接口无法传递object参数的问题
- 解决WCF接口无法传递object参数的问题
- Java-String类型的参数传递问题
- csharp编写界面,opencv编写类库,解决 Pinvoke过程中的参数传递和平台调用问题
- java参数传递问题
- 基本数据类型的包装类型作为参数传递,以及其他引用类型作为参数传递,以及List中值的交换的一些问题
- python 中参数传递 * 和 ** 的问题,以 tuple和dict方式传递参数
- 解决SQL中in参数在存储过程中的传递问题
- pthread_create 参数传递指针问题
- RIDE传递到python中的参数不统一,出现兼容性问题
- CAS向客户端传递参数乱码问题
- struts2中result传递参数问题1
- 关于参数传递的问题 这个帖子的感想
- Js的Url中传递中文参数乱码,如何获取Url中参数问题