javascript - 难以掌握 JavaScript 闭包(即,为什么这个 for 循环不起作用?)

标签 javascript for-loop closures

Possible Duplicate:
How do JavaScript closures work?

我搜索了常见问题解答并看到了示例,但我似乎无法理解为什么这不起作用。我真的很感激任何关于我做错了什么的提示。 我想做的就是取一个单词,然后单击按钮,为每个字母一次显示一个图像,拼写出该单词(并且图像应该淡入/淡出)。 这是经典的“for 循环仅显示最后一项”问题,但问题是,控制台记录正确。变量发生变化,但仅显示最后一个图像。我再次真诚地感谢任何帮助理解我做错了什么的帮助,因为我知道完全理解这一点很重要。下面的代码(我省略了 HTML,因为它只是一个更新的 div 和一个按钮):

$(document).ready(function () {
  var word = 'abc';

  $('#newWordButton').click(function () {
    function animateLetters() {
      function changeLetter() {
        for (i = 0; i < word.length; i++) {
          var currentLetter = word.charAt(i);
          console.log(currentLetter);
          $('#wordsDiv').fadeOut(1000, function () {
            $('#wordsDiv').replaceWith('<img src = "images/letters/' + currentLetter + '.gif" />');
            $('#wordsDiv').fadeIn(1000);
          });
        }
      }
      setTimeout(changeLetter, 1000);
    }

    animateLetters();
  });
});

最佳答案

您需要通过将值作为参数传递给自执行函数来使 currentLetter 成为一个闭包。当您的函数执行时,这将为您保留该值。

未经测试的示例:

for (i = 0; i < word.length; i++) {
    (function (currentLetter) {
        console.log(currentLetter);
        $('#wordsDiv').fadeOut(1000, function () {
            $('#wordsDiv').replaceWith('<img src = "images/letters/' + currentLetter + '.gif" />');
            $('#wordsDiv').fadeIn(1000);
        });
    )(word.charAt(i));
}

关于javascript - 难以掌握 JavaScript 闭包(即,为什么这个 for 循环不起作用?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13458474/

相关文章:

javascript - Angular 循环误差

javascript - 在应用程序外部调用路由更改(react-router)

javascript - Chrome : How to insert two consecutive spans into editable body without nesting them

javascript - 将负 BigInteger(Tom Wu 的 JSBN 库)值转换为十六进制值

go - golang的 "defer"怎么捕获闭包的参数?

java - 是否有可序列化的标准闭包接口(interface)?

javascript - 在 console.log 输出中显示冒号

r - 如果出错,则在 R 中的 for 循环中进行下一次迭代

python - 为什么此函数会导致 ['h'、 '-'、 '-'、 '-'、 '-']?

javascript - 隔离外部Javascript,防止污染?