1

我正在创建两个函数名 call 和 call2 并将这两个函数放在数组 x 中。在另一个名为 timer 的函数中,我试图每 2 秒调用一次此函数。但是它给出的错误期望的是赋值或函数调用而不是 show 和 expression

而且我不希望这个函数在我创建一个数组时运行。这是我的代码http://jsbin.com/IMiVadE/2/

function call(name)
{
  console.log("Hello " + name);
}

function call2()
{
  console.log("Hello world");
}

var x = [call("Nakib"), call2()];
var i = 0;

function timer(x, i)
{
  x[i];
  i++;
  if(i<x.length)
     window.setTimeout(timer(x, i), 2000);

}
timer(x, i);
4

3 回答 3

1

您的代码中有一些错误:

  • call2() 调用该函数。正确: call2 是对函数的引用。
  • x[i] 访问值(函数引用)。您需要 x[i]() 来执行该函数。

这是您的代码工作:http: //jsbin.com/IMiVadE/6/edit

sayHello(name) 是一个生成新函数的函数,该函数输出特定的“Hello ...”文本。

function sayHello(name)
{
  return function () {
    console.log("Hello " + name);
  }
}

function timer(x, i)
{
  x[i]();
  if (i < x.length - 1) {
    setTimeout(function () {
      timer(x, i + 1);
    }, 2000);
  }
}

var x = [sayHello("Nakib"), sayHello("world")];

setTimeout(function () {
  timer(x, 0);
}, 2000);
于 2013-10-06T08:37:12.777 回答
0

setTimeout需要一个没有参数的函数。因此,您可以将递归调用包装timer在匿名函数中以解决该问题:

window.setTimeout(function(){timer(x, i)}, 2000);

此外,您的计时器函数中的第一行(仅由 组成x[i];)是无用的,尽管它可能不是您的问题的原因。

于 2013-10-06T08:27:43.417 回答
0

setTimeout函数将函数作为参数,您在timer传递函数之前正在执行该函数,并且由于timer不返回任何内容,undefined因此正在传递给超时;

window.setTimeout(timer(x, i), 2000); // is the same as...
window.setTimeout(undefined, 2000);

它应该是;

window.setTimeout(function() { timer(x, i) }, 2000); // or...
window.setTimeout(timer.bind(this, x, i), 2000);

我不确定这是否是故意的,但是您正在对阵列做同样的事情;

var x = [call("Nakib"), call2()];

这将执行函数,它们的结果将存储在数组中。这是你想要的吗?

于 2013-10-06T08:28:32.117 回答