2011-12-13 70 views
0

我在网站上使用以下函数。为了避免我使用的马虎jQuery,有没有什么办法可以多次运行这个函数,而不必声明它是一个独立的函数,而且不需要复制和粘贴代码几次?使用javascript的setTimeout多次运行匿名函数

附件A:

setTimeout(function(){ 

    $('.nav > li > a').each(function(k,el){ 
     var width = $(this).parent().width(); 
     $(this).next('span').width(width); 
    }); 

},1000); 

我不想这样做:

setTimeout(function(){ 
     // same code here 
},1000); 

setTimeout(function(){ 
     // same code here 
},3000); 

setTimeout(function(){ 
     // same code here 
},5000); 

也不想这样做:

function myfunction{ 
    // same code here 
} 

setTimeout('myFunction()',1000); 
setTimeout('myFunction()',3000); 
setTimeout('myFunction()',5000); 
+0

你是否想要它在setTimeout(基本上每X秒运行一次)结束时调用自己,或者只是n个不同的setTimeout调用具有相同的功能? – Corbin 2011-12-13 19:47:41

回答

3
for (var i = 1000; i <= 5000; i += 2000) { 
    setTimeout(func, i); 
} 

var times = [1000, 3000, 5000]; 
for (var i=0; i<times.length; i++) { 
    setTimeout(func, times[i]); 
} 

较新的浏览器只有

[1000, 3000, 5000].forEach(function(time){ 
    setTimeout(func, time); 
}); 
+0

不错的使用与原生js的映射 – cwd 2011-12-13 19:56:48

3

是,使用setInterval方法。

setInterval(function() { 
    $('.nav > li > a').each(function(k,el){ 
     var width = $(this).parent().width(); 
     $(this).next('span').width(width); 
    }); 
}, 2000); 

//run every two seconds 

或者,你可以调用的setTimeout反复...

myFun = function() { 
    $('.nav > li > a').each(function(k,el){ 
     var width = $(this).parent().width(); 
     $(this).next('span').width(width); 
    }); 
    setTimeout(myFun, 2000); 
} 

setTimeout(myFun,1000); 

这应该有相同的效果做1000,3000,等...

+0

如何在10秒后停止? – cwd 2011-12-13 19:50:44

+0

如果使用setInterval,则可以使用clearInterval。或者,如果您必须从1,3等计数,则可以为您的时间过去一个变量,如果大于10秒,则不会调用最终的setTimeout。 – 2011-12-13 19:54:05

+0

+1非常感谢 – cwd 2011-12-13 21:33:24

1

你可以使用$.map

$.map([1000,3000,5000], function(time,index){ 

setTimeout(function(){ 
     $('.nav > li > a').each(function(k,el){ 
     var width = $(this).parent().width(); 
     $(this).next('span').width(width); 
    }); 
},time); 

}); 
1
(function(){ 
    var i, weirdProblem = function(timeout) { 
     setTimeout(function() { 
      $('.nav > li > a').each(function(){ 
       var width = $(this).parent().width(); 
       $(this).next('span').width(width); 
      }); 
     },timeout); 
    }; 
    for(i = 1; i <= 5; i+=2) { 
     weirdProblem(i*1000); 
    } 
})(); 

封闭封装的声明,将垃圾收集一次不再使用。不确定这点。很奇怪。