2012-01-19 36 views
2

我正在爲明天工作的最後一天在javascript中創建煙花表演,我在使它自動化時遇到了一些麻煩。我正在使用發現的煙花here,它效果很好,但是這將在我剛剛開發的狀態網頁上顯示,所以我希望煙花是自動而不是點擊。在定時器上調用Javascript匿名函數方法

我創建了fireworks.js頁面看起來像這樣的一個功能...

function fireFireworks(){ 
    var num = Math.floor(Math.random()*3) + 1; 
    for(i=0;i<num;i++){ 
     createFirework(); 
    } 
} 

這將用於火煙花1和3之間時,它的調用。然後,我設置

setInterval('fireFireworks()', 5000); 

當這兩個在我的本地文件中定義,而不是在fireworks.js文件我得到一個壞參考createFirework()

所以我搬到了fireFireworks()到剛剛在fireworks.js初始化功能下,然後我會得到一個壞的參考fireFireworks()讓我感動我的setIntervalintialize功能,但我仍然得到一個壞參考fireFireworks()。但是,如果我更改onmouseup的活頁夾從 document.addEventListener('mouseup',createFireworks,true); 至 document.addEventListener('mouseup',fireFireworks,true);

它成功創建了我的多個煙花。

我假設setInterval的範圍在這裏播放一部分。如果有人可以給我一個關於如何自動化的信息以及一些關於爲什麼我的設置無法正常工作的信息,我會非常感激!

+1

你試過'setInterval(fireFireworks,5000)'嗎? – pimvdb

+1

請不要在'setInterval()'中使用字符串,使用匿名函數或函數名稱本身:'setInterval(fireFireworks,5000);' – ComFreek

+0

@pimvdb,我曾經在fireworks.js文件中執行過該方法。仍然沒有運氣。 – Shaded

回答

3

這是更好的函數本身傳遞給setInterval,即

setInterval (fireFireworks, 5000) 

至於範圍界定,如果不使用其他任何地方你createFireworks功能,只是把它fireFireworks和你不必須再擔心它(無論如何,通常認爲它更好,因爲它避免了污染全球範圍)。

否則,在封閉包裝兩個功能:

(function() 
{ 
    function fireFireworks() 
    { 
     /* ... */ 
    } 

    function createFirework() 
    { 
     /* ... */ 
    } 

    setInterval (fireFireworks, 5000) 

})(); 
+0

有趣的是,作爲一個字符串傳遞函數在一般情況下工作,但不涉及關閉時。 – Shaded

+0

這是因爲字符串稍後在全局範圍內進行評估。你的函數的名字只意味着封閉內的任何東西。 –

-1

您正在使用setInterval()函數來調整您的作用域(使用字符串)。嘗試添加到您的初始化函數:

var fireworksTimer = setInterval(fireFireworks, 5000); 

然後如果你做fireFireworks「公共」的功能,

fireFireworks = function(){ 
     .... 
} 
在單獨的js文件

,現在應該是可調用的。

+0

'saveFormState' ?? – cambraca

+0

意外提交。神聖的快速投票,對不起,擊中選項卡然後空間,這=在SO提交。 – Jlange

+0

好吧,其實downvote是爲了別的東西:在'setInterval'中放置一個字符串不是錯誤的*,它非常難看。 – cambraca

0

試試這個:

(function(global){ 
    var theShow = {}, 
     createFirework; 

    createFirework = function() { 
    };  

    theShow.fireFireworks = function() { 
     var num = Math.floor(Math.random()*3) + 1, 
      i = 0; 
     for(i;i<num;i++){ 
      createFirework(); 
     } 
    }; 
    global.setInterval(theShow.fireFireworks , 5000); 
    global.theShow = theShow; 
}(window)); 

您現在可以的,只要它是在應用程序中調用theShow.firFireworks()從任何JavaScript代碼此代碼被調用後。希望這可以幫助。