【问题标题】:What is wrong with this Javascript script?这个 Javascript 脚本有什么问题?
【发布时间】:2015-10-27 16:25:26
【问题描述】:

我正在这样写一个简单的计时器:

   function timer(init){
     console.log(init);
     setTimeout(function(init){
       timer(init+1);
     },1000);
   }

   timer(1);

这是一个递归函数(注意:我知道这是一个无限循环,只是现在不重要)。然而,尽管看起来很简单,但它失败了,因为每个间隔的输出都是 NaN,而不是预期的增加的数字。 该功能非常简单,我无法弄清楚问题所在。我错过了什么?

【问题讨论】:

  • function(init){...} 使 init 成为 undefinedsetTimeout 不向回调传递参数。删除它。

标签: javascript recursion settimeout


【解决方案1】:

您传递给 setTimeout 的函数体是一个回调函数,没有传递任何参数(因为 setTimeout 没有传递任何参数)。

function timer(init) {
  console.log(init);
  setTimeout(function() {
    timer(init + 1);
  }, 1000);
}

timer(1);

最简单的方法是这样的:

var t = 0;

function timer() {
  console.log(++t);
  setTimeout(timer, 1000);
}

timer();

【讨论】:

  • 您可能需要添加至少 一些 解释。
  • 我不太明白第二个例子的目的。没有人会写出那样的代码(我希望如此)。
  • 抱歉,@FelixKling 正在编写它,然后通过传递参数决定了展示方式。完全没有目的,只是表明论点应该去哪里。
  • 好的,我决定用使用外部变量的版本替换它。
【解决方案2】:

这里的问题是您通过将参数传递给setTimeout 的回调函数来覆盖init 的值。

function timer(init) {
  console.log(init);
  setTimeout(function() {
    timer(init+1);
  },1000);
}

timer(1);

这样init 值就是您传递给timer 调用的值。

【讨论】:

    【解决方案3】:

    您需要将匿名函数作为参数而不是字符串提供,后一种方法甚至不应该根据 ECMAScript 规范工作,但浏览器只是宽松的。

    setTimeout(function() {
        timer(init+1);
    }, 1000)
    

    【讨论】:

    • OP 似乎已经这样做了......不确定我明白你的意思吗?该函数也不必是匿名的。有趣的事实:setTimeout 甚至不是 ECMAScript 的一部分,它是 HTML 规范的一部分:w3.org/TR/2011/WD-html5-20110525/timers.html#timers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多