setTimeout并将变量一起传递给匿名函数

时间:2014-07-29 21:58:46

标签: javascript html

我正在编写代码而且我坚持使用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]);

当我使用for (var i=array.length-1; i>=0;i--)为什么时,我遇到延迟问题? (这个代码的想法是显示项目数组从最后到第一个)

for (var i=0;i <= array.length-1;i++) {
                        (function(el) {
                            setTimeout(function(){

现在提供与for (var i=array.length-1; i>=0;i--) { console.log(array[i]+'!')

相同的结果

3 个答案:

答案 0 :(得分:2)

这里的问题是关闭。闭包是一种匿名函数,用于记住在异步函数中使用它们的参数(如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=array.length-1; i>=0;i--) {
    (function(el) {
        setTimeout(function(){
            document.getElementById('Result').innerHTML += Math.floor(el)
        }, 3000*(array.length-i));
    })(array[i]); 
}

答案 1 :(得分:1)

在主函数完成之后,超时才会执行,这意味着在每个循环执行超时函数时,您的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);
}

答案 2 :(得分:0)

首先,您立即调用该函数,并将其结果指定为超时的回调。 (这是错误的,因为第一个参数必须是函数

然后,您有一些语法错误,错过了结束}) ..

尝试

for (var i=array.length-1; i>=0;i--) {
    function(array,i){ 
        setTimeout(function(){
            document.getElementById('Result').innerHTML += Math.floor(array[i]);
        }, 3000*i);
    }(array,i);
}

我使用了3000*i,因此每个超时都是在另一个

之后3秒