【问题标题】:Javascript Anonymous Function Quiz [duplicate]Javascript匿名函数测验[重复]
【发布时间】:2013-12-18 04:14:19
【问题描述】:

给定以下 javascript 代码:

function countdown (num) {
    for (var i = 0; i <= num; i += 1) {
        setTimeout(function () {
            alert(num - i);
        }, i * 1000);
    }
}

countdown(5);

所需的结果是使用警报消息从 5 倒计时到 0。解释为什么代码只警告 -1,然后修复代码使其按预期工作。

我找到了上面的 javascript 测验,但我真的不知道如何解决它。我知道它是匿名函数,它与变量范围有关,但我认为这是一个很好的机会来了解是否有人可以向我解释为什么它不起作用以及什么需要为了工作而要做。我寻求问题背后的理论和解决方案。

我知道我只能阅读匿名函数,但使用 “真正的问题” 的解释将帮助我将问题形象化并更好地理解它。

【问题讨论】:

标签: javascript closures anonymous-function


【解决方案1】:

像这样更改您的代码.. 功能倒计时 (num) {enter code here var j=0;setTimeout(function () { for (var i = 0; i }

倒计时(5);

【讨论】:

    【解决方案2】:

    http://jsfiddle.net/3p8FM/ 可以这样解决,绑定变量numi

    出现带有-1 的警报是因为i 的范围。当第一个函数在确定的时间后真正执行时,i 的值已经是 6

    【讨论】:

      【解决方案3】:

      由于i 的作用域,当匿名函数被调用时,循环结束并且i 在它的最终值(-1) 中。为了解决这个问题,您可以使用另一个匿名函数隔离一个本地范围,您可以在其中重新定义私有变量i,如下所示:

      function countdown (num) {
          for (var i = 0; i <= num; i += 1) {
              (function(i) {
                  setTimeout(function () {
                      alert(num - i);
                  }, i * 1000);
              })(i);
          }
      }
      
      countdown(5);
      

      【讨论】:

        猜你喜欢
        • 2013-11-22
        • 1970-01-01
        • 2015-02-19
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        • 2016-03-27
        • 1970-01-01
        相关资源
        最近更新 更多