2013-10-06 70 views
1

我正在创建两个函数名称call和call2,并将这两个函数放入数组x中。在另一个叫做timer的函数中,我试图每2秒调用一次这个函数。但它给出的错误预计分配或函数调用,而不是显示和表达式使用setTimeout在Javascript中调用函数的函数

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

回答

1

你在你的代码的一些错误:

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

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

即sayHello(name)是产生新的函数输出特定的“你好......”文本的功能。

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); 
+0

感谢人,我想让我的代码行为。 – Nakib

0

setTimeout需要的功能没有参数。所以,你可以用递归调用timer在一个匿名函数来解决这个问题:

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

而且,在你的计时器功能的第一线,仅由x[i];,是无用的,虽然它可能不是原因你的问题。

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

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

+0

我不希望它的结果被存储在一个数组中,但我希望该函数被存储,所以我可以在我的timer()函数中调用。 – Nakib

+0

@Nakib好吧,你需要再想一想你的代码是如何工作的,并且看看'头等功能'是如何工作的。如果您之后仍然需要帮助,请回来。我希望这有助于:) – Jivings

相关问题