search

Home  >  Q&A  >  body text

javascript for()循环里面的setInterval闭包问题, 看看我哪写错了

ShowCountDown(a,b,c,d,e){

}
for(var i=0; i<4; i++){
            var timeString = '<?php echo $timeString?>';
            var time = timeString.split(','); 
            var filterArray = time[i].split('-');
            window.setInterval((function(a,b,c,d,e){
            ShowCountDown();
            })(filterArray[0],filterArray[1],filterArray[2],'time',i)
            ,interval);
        }
阿神阿神2895 days ago380

reply all(5)I'll reply

  • 怪我咯

    怪我咯2017-04-10 15:28:19

    setInterval 的第一个参数是传一个function,你这里是已经执行了匿名函数,也就是说是这个函数的返回值。试下下面的代码:

    setInterval(
        function() {
            (function(a, b, c, d, e) {
                 ShowCountDown();
            })(filterArray[0],filterArray[1],filterArray[2],'time',i);
        }
        ,interval); 
    ) 
    

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:28:19

    接着1L
    for(....)
    {
    (function(a, b, c, d, e){
    setTimeout(function(){
    ShowCountDown(a, b, c, d, e);
    },1000*e)
    }(filterArray[0],filterArray[1],filterArray[2],'time',i))
    }
    我给的 类似于一个时间计时器不知道你的需求是不是这样。

    reply
    0
  • PHPz

    PHPz2017-04-10 15:28:19

    你的写法有问题,setInterval函数第一个参数接收的是一个function对象或者是一个代码片段的字符串表示(这个很拗口,说白了就是把你要执行的代码用“”包起来)。而你现在这种写法是先执行的匿名函数,然后将匿名函数的返回值给了setInterval的第一个参数。显然你的匿名函数并没有返回任何东西。
    你可以这样写

    for (var i = 0; i < 4; i++) {
        window.setInterval(function(){
                    todo(i);
        },interval);
    }
    

    但是这样写有另外一个问题,setInterval是异步的,等到到达执行的时间的时候,里面的i已经变成3了。需要通过作用域来确保变量的值是想要的值。

    for (var i = 0; i < 4; i++) {
        (function(i1){
            window.setInterval(function(){
                todo(i1);
            },interval);
        })(i);
    }
    

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 15:28:19

    window.setInterval方法接收的一个参数为一个函数,而非一个函数调用

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:28:19

    楼主想要使用闭包来解决 for 循环和异步调用的问题,思路是对的,但setInterval 第一个参数,应该是一个函数,我明白楼主的意思,是想把这些参数传给 ShowCountDown,这里可以这样改

    ShowCountDown(a,b,c,d,e){
    
    }
    for(var i=0; i<4; i++){
      var timeString = '<?php echo $timeString?>';
      var time = timeString.split(','); 
      var filterArray = time[i].split('-');
      window.setInterval((function(a,b,c,d,e){
        return ShowCountDown.bind(null, a, b, c, d, e);
      })(filterArray[0],filterArray[1],filterArray[2],'time',i), interval);
    }

    关于bind的介绍 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

    reply
    0
  • Cancelreply