【问题标题】:Calling function from array using setTimeout in Javascript在 Javascript 中使用 setTimeout 从数组调用函数
【发布时间】:2013-10-06 08:22:05
【问题描述】:

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

而且我不希望这些函数在我创建数组时运行。 这是我的代码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);

【问题讨论】:

    标签: javascript arrays function settimeout


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        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()];
        

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

        【讨论】:

        • 我不希望将其结果存储在数组中,但我希望存储该函数,以便我可以在 timer() 函数中调用。
        • @Nakib 好的,你需要重新考虑一下你的代码是如何工作的,看看first class functions 是如何工作的。如果之后您仍然需要帮助,请回来。我希望这会有所帮助:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-23
        • 2018-09-22
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        相关资源
        最近更新 更多