代码之家  ›  专栏  ›  技术社区  ›  Moak

使用setTimeout将正确的项传递给其他函数时出现问题

  •  0
  • Moak  · 技术社区  · 16 年前

    我的问题是:

    var slide;
    $$('#slides li').each(function(i, n) {
        slide = i;
        setTimeout("initiateSlide()",n * 500)                     
    });
    function initiateSlide(){
        i = slide;
        alert(i); // pretty much alerts the last one 5 times
    }
    

    我期待 initiateSlide() 用5张不同的幻灯片,我只得到最后一张5次。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Brenton Alker    16 年前

    您的问题是,您在initiateslide()函数中引用的全局变量(slide)在函数运行时设置为最后一个。您可能希望使用闭包来维护变量的状态。这样地:

    $$('#slides li').each(function(i, n) {
        setTimeout(function() { initiateSlide(i); }, n * 500)
    });
    function initiateSlide(i){
        alert(i);
    }
    

    注意-这也完全消除了对全球

        2
  •  1
  •   Christian C. Salvadó    16 年前

    我建议您去掉全局变量,并将循环中的每个幻灯片作为参数传递给 initiateSlide 功能:

    $$('#slides li').each(function(slide, n) {
      setTimeout(function () {
        initiateSlide(slide);
      }, n * 500)                     
    });
    
    function initiateSlide(slide){
      alert(slide);
    }​
    

    在您的示例中, each 循环在任何之前结束 setTimeout 已执行回调,您的 起始词 正在使用上次迭代的元素调用函数。