setInterval - 如何保存传入的变量

时间:2013-12-30 17:54:14

标签: javascript setinterval

我在SO上做了一些挖掘,无法找到我想要实现的目标。

简单来说,我有一个像

这样的功能
function(){
   for(i=0;i<10;i++){
      setInterval(function(){ alert(i);), 1000)
   }
}

我期望的是10个setIntervals会每1秒发出1到10个警报,会发生什么事情,因为在for循环结束时“i”为10,所以会发出警告10。如何将'i'传递给setInterval匿名函数,以便我可以在setInterval中保留i的值?

上面是我实际问题的简单版本。我实际上是想这样做 var timers = [];

function(obj){
   //Clear any intervals
   for(i=0;i<timer.length;i++){
      clearInterval(timers[i]);
   }

   // Empty timers Array
   timers = [];

   for(i in obj){
      //My object from the dom. This guy is what I am trying to preserve
      my_obj = document.getElementById(i);
      if(obj[i] === "Something"){
         timers.push(setInterval(function(){
            my_obj.replace_class(["Something", "Otherthing"],"Something");
         }, 1000)
      }
   }
}
上面代码中的

my_obj总是指obj中的id = last'i'。

我有道理吗?

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题;)

for(i = 1; i < 11; i++){
  (function(local_i){ 
    setInterval(function(){ console.log(local_i); }, 1000 * local_i)
  })(i);
}

答案 1 :(得分:2)

您必须在closure中捕获变量。在你的情况下,这是

function capture(x) {
    setInterval(function () {
        console.log(x);
    }, 1000);
}

for (var i = 0; i < 10; i++) {
    capture(i);
}

function capture(my_obj) {
    var id = setInterval(function() {
        my_obj.replace_class(["Something", "Otherthing"],"Something");
    }, 1000);

    return id;
}

for (i in obj) {
    //My object from the dom. This guy is what I am trying to preserve
    my_obj = document.getElementById(i);
    if (obj[i] === "Something") {
         timers.push(capture(my_obj));
    }
}