Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript setInterval覆盖其他setInterval_Javascript_Jquery_Html - Fatal编程技术网

Javascript setInterval覆盖其他setInterval

Javascript setInterval覆盖其他setInterval,javascript,jquery,html,Javascript,Jquery,Html,我试图创建多个setInterval并存储它们(稍后清除),但当我这样做时,最后一个setInterval会覆盖上一个setInterval,对每个setInterval执行一次,但内容相同 具有奇怪行为的代码段: var timeoutFunctions={}; 控制台上的功能日志(文本){ console.log('>>>内部函数:'+text) } $(文档).ready(函数(){ 对于(i=0;i

我试图创建多个setInterval并存储它们(稍后清除),但当我这样做时,最后一个setInterval会覆盖上一个setInterval,对每个setInterval执行一次,但内容相同

具有奇怪行为的代码段:

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例如我应该加一句话来解释那件事。编辑完成