我在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'。
我有道理吗?
答案 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));
}
}