【问题标题】:Javascript For Loop Closures...Can't seem to wrap my head around this [duplicate]Javascript For Loop Closures ...似乎无法理解这个[重复]
【发布时间】:2011-03-24 02:49:15
【问题描述】:

可能重复:
Javascript closure inside loops - simple practical example

我怎样才能做到这一点?

// Phrases

var phrases = new Array();
phrases[0] = 'Phrase 1';
phrases[1] = 'Phrase 2';
phrases[2] = 'Phrase 3';

for (var i = 0; i < phrases.length; i++) {  
   var content = phrases[i];        
   $('#phrase').html(content).slideDown('slow').delay(1000).fadeOut('slow');    
};

这是 HTML:

<p id="phrase"></p>

content 变量传递给 html() 函数我注意到 content 总是等于数组中的最后一个短语,并且循环运行幻灯片/延迟/淡入淡出功能 3 次。

我知道这与 for 循环中的闭包有关,并且我查看了无数示例,但我就是无法理解它。有人可以解决这个问题并向我解释一下吗?

编辑:抱歉之前不清楚,我已经编辑了这个问题以包含 HTML 和有问题的数组。

功能:不同的短语保存在 phrases[] 数组中,我想将短语插入到 &lt;p&gt; 元素中,然后向下滑动该元素,将其留在屏幕上一秒钟,然后淡出。然后我想转到 phrases[] 数组中的下一个短语并执行相同的功能。

【问题讨论】:

  • 循环真正做的是选择具有该 id 的元素并在循环的每次迭代中写入它,因此它每次都会覆盖它,直到最后一次迭代。解释你想要做什么
  • 感谢 Crayon,我已更新问题以反映我正在尝试做的事情。
  • 难道 delay(1000) 实际上现在返回控制权并插入一个任务以从现在开始 1 秒或 1000 秒后发生(原型需要几秒钟)?如果是这样,循环将很快执行,然后在 1 秒后所有排队的屏幕更改将很快发生。另外,我不确定带有 delay() 的行在语法上是否有效,至少在与prototype.js 一起使用时是这样。不过我还没试过。

标签: javascript loops for-loop closures


【解决方案1】:

您实际上并没有遇到闭包问题,它只是在每次迭代时将innerHTML 设置为content,这并没有考虑需要首先完成的效果。

var showPhrase = function(phrases, start) {
    start = start || 0;
    var showNext = function() {
        $('#phrase')
         .html(phrases[start])
         .slideDown('slow')
         .delay(1000)
         .fadeOut('slow', function() {
            start++;
            if (start < phrases.length) {
                showNext();
            }
        });
    }
    showNext();
}

showPhrase(['a', 'b', 'c']);

jsFiddle.

【讨论】:

  • 嗨,亚历克斯,感谢您的回复。这当然有效,但我希望将短语数组中包含的短语与字母 a、b 和 c 相对显示。
  • 抱歉出现了键盘问题 - 我该如何修改您的脚本,以便它能够从数组本身读取短语?
  • @FrediDoo:查看 this
  • 问题解决了!非常感谢!
  • @FrediDoo 抱歉,我出去吃午饭了。用你自己的替换我的示例数组很简单。
猜你喜欢
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 2017-03-27
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多