这个 Javascript 脚本有什么问题?

What is wrong with this Javascript script?

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

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

   timer(1);

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

您传递给 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();

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

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

timer(1);

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

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

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