jssetTimeOut()⽅法传参
转载出⾃:
在javascript编程中常⽤到setTimeout函数定时执⾏某函数,可在给函数传参时容易出现问题,这⾥是⾃⼰在⼯作过程中的总结:
1、采⽤字符串
setTimeout("start(" + argu + ")",1000)
此⽅法⽤于传递字符串,⽆法传递对象
2、匿名函数
setTimeout(function(){ start(argu)},1000); 调⽤start函数并传arg参数
字符串、对象都⾏
3、在有些情况下需在循环中使⽤,如:
window.οnlοad=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]),所以输出结果相同。
js arguments这种情况怎么解决呢,只需把setTimeout封装到⼀个函数中即可
window.οnlοad=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.οnlοad=function(){
var a=[{id:1},{id:2},{id:3},{id:4}];
for(var i=0;i<3;i++){
util.setTimeout(start,1000,a[i]);
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论