Javascript setInterval覆盖其他setInterval
我试图创建多个setInterval并存储它们(稍后清除),但当我这样做时,最后一个setInterval会覆盖上一个setInterval,对每个setInterval执行一次,但内容相同 具有奇怪行为的代码段:Javascript setInterval覆盖其他setInterval,javascript,jquery,html,Javascript,Jquery,Html,我试图创建多个setInterval并存储它们(稍后清除),但当我这样做时,最后一个setInterval会覆盖上一个setInterval,对每个setInterval执行一次,但内容相同 具有奇怪行为的代码段: var timeoutFunctions={}; 控制台上的功能日志(文本){ console.log('>>>内部函数:'+text) } $(文档).ready(函数(){ 对于(i=0;i
var timeoutFunctions={};
控制台上的功能日志(文本){
console.log('>>>内部函数:'+text)
}
$(文档).ready(函数(){
对于(i=0;i<5;i++){
console.log('>>>函数之前:'+i)
timeoutFunctions[i]=setInterval(function(){log_on_console(i)},2000);
}
});代码>
使用闭包()
$(文档).ready(函数(){
对于(变量i=0;i<5;i++){
console.log('>>>函数之前:'+i)
(功能(当前){
timeoutFunctions[当前]=设置间隔(函数(){
登录控制台(当前)
}, 2000);
})(一)
}
});
使用闭包()
$(文档).ready(函数(){
对于(变量i=0;i<5;i++){
console.log('>>>函数之前:'+i)
(功能(当前){
timeoutFunctions[当前]=设置间隔(函数(){
登录控制台(当前)
}, 2000);
})(一)
}
});
此处的功能:
timeoutFunctions[i] = setInterval(function(){log_on_console(i)}, 2000);
…具有对i
变量的持久引用,而不是创建函数时其值的副本。因此,它使用调用时的i
值
如果要在创建函数时将i
的值刻录到函数中,可以使用function\bind
:
timeoutFunctions[i] = setInterval(function(val){log_on_console(val)}.bind(null, i), 2000);
或者更直接地说,您的匿名函数只是在控制台上调用log\u
:
timeoutFunctions[i] = setInterval(log_on_console.bind(null, i), 2000);
Function#bind
返回一个函数,该函数在调用时将调用原始函数,并将this
设置为您给出的第一个参数bind
,并传递任何附加参数。因为您的函数没有使用this
,所以我只对该参数使用了null
。例如:
function foo(a) {
console.log("a = " + a);
}
var f = foo.bind(null, 1);
f();
向我们展示:
a = 1
a=1
旁注:您的代码受到攻击,因为您没有在任何地方声明i
。此处的函数:
timeoutFunctions[i] = setInterval(function(){log_on_console(i)}, 2000);
…具有对i
变量的持久引用,而不是创建函数时其值的副本。因此,它使用调用时的i
值
如果要在创建函数时将i
的值刻录到函数中,可以使用function\bind
:
timeoutFunctions[i] = setInterval(function(val){log_on_console(val)}.bind(null, i), 2000);
或者更直接地说,您的匿名函数只是在控制台上调用log\u
:
timeoutFunctions[i] = setInterval(log_on_console.bind(null, i), 2000);
Function#bind
返回一个函数,该函数在调用时将调用原始函数,并将this
设置为您给出的第一个参数bind
,并传递任何附加参数。因为您的函数没有使用this
,所以我只对该参数使用了null
。例如:
function foo(a) {
console.log("a = " + a);
}
var f = foo.bind(null, 1);
f();
向我们展示:
a = 1
a=1
旁注:您的代码受到攻击,因为您没有在任何地方声明i
。提示:搜索闭包:)提示:搜索闭包:)我可以想到两个原因:1。很多人都会被i
的各种不同含义弄糊涂,这就是为什么我总是使用不同的名称来表示arg。2.没有解释的代码转储不太有用。不过,编辑显示他们撤回了否决票。另外,在循环中创建额外的丢弃函数也不是一个好主意。@mplungjan是的。。你是correct@T.J.Crowder我必须承认,我终于比你更了解这个结局了bind@mplungjan例如我应该加一句话来解释那件事。编辑DoneI可以想到两个原因:1。很多人都会被i
的各种不同含义弄糊涂,这就是为什么我总是使用不同的名称来表示arg。2.没有解释的代码转储不太有用。不过,编辑显示他们撤回了否决票。另外,在循环中创建额外的丢弃函数也不是一个好主意。@mplungjan是的。。你是correct@T.J.Crowder我必须承认,我终于比你更了解这个结局了bind@mplungjan例如我应该加一句话来解释那件事。编辑完成