2013-10-06 72 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

相關問題