Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.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 setTimeout并将变量一起传递给匿名函数_Javascript_Html - Fatal编程技术网

Javascript 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

我正在写代码,我一直坚持使用setTimeout函数。我想得到动画效果。延迟显示阵列的元素。代码完成了

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