Javascript setTimeout并将变量一起传递给匿名函数
我正在写代码,我一直坚持使用setTimeout函数。我想得到动画效果。延迟显示阵列的元素。代码完成了Javascript setTimeout并将变量一起传递给匿名函数,javascript,html,Javascript,Html,我正在写代码,我一直坚持使用setTimeout函数。我想得到动画效果。延迟显示阵列的元素。代码完成了 for (var i=0;i <= array.length-1;i++) { (function(el) { setTimeout(function(){ document.getElementById('Result').i
for (var i=0;i <= array.length-1;i++) {
(function(el) {
setTimeout(function(){
document.getElementById('Result').innerHTML += Math.floor(el);
console.log(Math.floor(el));
}, 3000*(i+1));
})(array[i]);
现在给出与(var i=array.length-1;i>=0;i--)相同的结果:){
console.log(数组[i]+'!')
直到主函数完成后,才会执行超时,这意味着在每次循环执行超时函数时,i变量将处于其最终值(在本例中为0)。您的函数声明也不正确,因为超时函数没有为您传递这些参数。为此,您需要将超时封装在另一个函数调用中,该函数调用接收当前循环的参数,请尝试类似的操作
for (var i=array.length-1; i>=0;i--) {
function(array, i) {
setTimeout(function() {
document.getElementById('Result').innerHTML += Math.floor(array[i]);
}, (i+1) * 3000);
}(array, i);
}
直到主函数完成后,才会执行超时,这意味着在每次循环执行超时函数时,i变量将处于其最终值(在本例中为0)。您的函数声明也不正确,因为超时函数没有为您传递这些参数。为此,您需要将超时封装在另一个函数调用中,该函数调用接收当前循环的参数,请尝试类似的操作
for (var i=array.length-1; i>=0;i--) {
function(array, i) {
setTimeout(function() {
document.getElementById('Result').innerHTML += Math.floor(array[i]);
}, (i+1) * 3000);
}(array, i);
}
首先,您立即调用该函数,其结果被指定为超时的回调。(这是错误的,因为第一个参数必须是函数) 然后,您会遇到一些语法错误,缺少结束语
}
和)
试一试
我使用了
3000*I
,这样每个超时都是在另一个超时之后的3秒首先,您立即调用函数,其结果被指定为超时的回调。(这是错误的,因为第一个参数必须是函数)
然后,您会遇到一些语法错误,缺少结束语}
和)
试一试
我使用了
3000*I
,因此每个超时都是在另一个超时之后3秒这里的问题是关于闭包的问题。闭包是一种匿名函数,用于记住稍后在异步代码中使用它们的参数(例如,在由setTimeout
调用的函数中)
如果你写了这样的东西:
setTimeout(function(foo){...}(value), 3000)
在调用setTimeout
之前调用该函数。您必须使用闭包来执行此操作:
(function(foo){
setTimeout(function() {
... do something with foo ...
}, 3000);
})(value_of_foo);
此代码将记住foo
的值,并使用使用它的函数创建setTimeout
另一个问题是,您必须增加setTimeout
时间来创建延迟,否则for
将创建一组setTimeout(…,3000)
,这些将同时执行。因此,您需要对代码执行以下操作:
for (var i = 0; i <= array.length; i++) {
(function(el) {
setTimeout(function(){
document.getElementById('Result').innerHTML += Math.floor(el)
}, 3000 * i);
})(array[i]);
}
for(var i=0;i这里的问题是关于闭包的。闭包是一种匿名函数,用于记住参数,以便以后在异步代码中使用(例如,在由setTimeout
调用的函数中)
如果你写了这样的东西:
setTimeout(function(foo){...}(value), 3000)
在调用setTimeout
之前调用该函数。必须使用闭包才能执行此操作:
(function(foo){
setTimeout(function() {
... do something with foo ...
}, 3000);
})(value_of_foo);
此代码将记住foo
的值,并使用使用它的函数创建setTimeout
另一个问题是,您必须增加setTimeout
时间来创建延迟,否则for
将创建一组setTimeout(…,3000)
,这些将同时执行。因此,您需要对代码执行以下操作:
for (var i = 0; i <= array.length; i++) {
(function(el) {
setTimeout(function(){
document.getElementById('Result').innerHTML += Math.floor(el)
}, 3000 * i);
})(array[i]);
}
for(var i=0;i)您不使用的具体原因是什么?这使得这类事情非常简单。在您的setTimeout
代码段中,您没有输入延迟时间:}(数组,i),3000);
您正在立即调用该函数,并将返回值undefined
传递给setTimeout
。jQuery与此无关;它只是写得不正确。在循环中确实需要一个anon来捕获i和数组,但需要立即调用该anon。相反,您正在调用setTimeout回调im“你的回答不起作用!未损坏的语法错误:意外标记(”我认为语法错误是最容易修复的。请阅读这些文章,这样您就可以自助了。您不使用的具体原因是什么?这使得这类事情变得非常简单。在您的setTimeout
代码片段中,您没有添加延迟时间:}(array,I),3000);
您正在立即调用该函数,并将返回值undefined
传递给setTimeout
。jQuery与此无关;它只是写得不正确。在循环中确实需要一个anon来捕获i和数组,但需要立即调用该anon。相反,您正在调用setTimeout回调im“你的回答不起作用!未捕获的语法错误:意外的标记(“我认为语法错误是最容易修复的。请阅读这些文章,这样你就可以帮助自己了。我认为你在这里遗漏了一些东西。代码在语法上是无效的。对于动画,0应该是I还是(I*10)?我已经放了(I+1)*3000作为延迟,但可以更改为您的延迟程度want@GabyakaG.Petrioli抱歉,修复程序我认为您缺少某些内容。代码在语法上无效。对于动画,0不应该是i还是(i*10)?我已经输入(i+1)*3000作为延迟,但可以更改为您的延迟程度want@GabyakaG.Petrioli很抱歉,fixedit在动画方面似乎正在倒退,因此您可能需要计算…由于语法错误,显示的代码也无法在chrome中运行:(@dandavis,是的..我已经更新了..它似乎在倒退动画,所以你可能应该计算一下…显示的代码也没有在chrome中运行,因为语法错误:(@dandavi