2012-05-21 82 views
7

我試圖運行一個隨機函數,但還沒有完全想通了:如何在JavaScript中運行隨機選擇的函數?

<script> 

function randomFrom(array) {return array[Math.floor(Math.random() * array.length)];} 

function randomchords(){randomFrom(['poop()', 'poop2()', 'poop3()']);}    



function poop() { $(function() {ionian_c_vi() }); }       

function poop2() { $(function() {ionian_c_iii() }), $(function() {ionian_c_iv() }); }      

function poop3() { $(function() {ionian_c_vi() }), $(function() {ionian_c_i() }), $(function() {ionian_c_ii() }); } 

</script> 

然後:

<button onclick="randomchords()" >Get some random chords</button> 

我在正確的軌道上?

+2

'poop()'函數返回什麼? – Marko

+0

只需粘貼一些eval就可以了,你就會變成金色! +1上的便便功能BTW。 – adeneo

+0

它拉斐爾繪製夏威夷四絃琴和絃!當它完成時,它會吐出隨機和絃進行。 – jthomasbailey

回答

9

一種選擇是使用window對象:

function randomchords() { 
    var func = randomFrom(['poop', 'poop2', 'poop3']); 
    window[func](); 
} 

講究,你應該從函數名數組中刪除括號。


另一種選擇是從上面的變種刪除報價並直接調用函數:

function randomchords() { 
    var func = randomFrom([poop, poop2, poop3]); 
    (func)(); 
} 
+0

...但也許它更好地存儲在他們自己的對象,而不是在全球的功能。 – Bergi

+0

@Bergi可能是的,但解決方案將幾乎相同。 – VisioN

+0

爲什麼是字符串?爲什麼不只是'randomFrom([poop,poop2,poop3])()'? – bobince

0

你可以做這麼多的方式:

但最簡單的,我認爲,產生一個隨機數,以及通話功能:)

$("button").click(function) 
{ 
    var n = Math.floor(Math.random()*11); 
    switch(n) 
    { 
     case: 0: 
     Function0(); 
     break; 

     case: 1: 
     Function1(); 
     break; 

     case: 2: 
     Function2(); 
     break; 

     ... 

     case: 10: 
     Function10(); 
     break; 
} 

有了btn,你可以撥打

<button>Get some random chords</button> 
5

函數就像值。你可以說:

var myArray = [ 
    function(){ 
     ionian_c_vi(); 
    }, 
    function(){ 
     ionian_c_iii(); 
     ionian_c_iv() 
    }, 
    function(){ 
     ionian_c_vi(); 
     ionian_c_i(); 
    } 
]; 
function randomchords(){ 
    randomFrom(myArray).call(); 
} 

欲瞭解更多信息,請查看http://www.yuiblog.com/blog/2010/02/24/video-crockonjs-3/和/或https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Call

Bookwise讀,讀的Javascript:好的部分(120頁)

幫助學習JS jQuery的外面: )

+1

更好!但'call'仍然是多餘的,'randomFrom(myArray)()'很好。 – bobince

+0

確實,這是多餘的,它更像是一種個人風格的選擇 - 它表示我期待着「可調用」的東西。在請求函數引用時,我總是使用call或apply。 – Aadaam

1

你是相當接近:

function foo() { ... } 
function bar() { ... } 
function baz() { ... } 

這些函數被定義爲全局範圍,在瀏覽器中通常是window。 例如,您可以通過調用window['foo']來通過字符串訪問它們。這將返回foo函數本身(不是來自執行的值)。

function randomFrom(array) { 
    return array[Math.floor(Math.random() * array.length)]; 
} 

function randomchords() { 
    // add the 'window' prefix here 
    randomFrom(window['foo', 'bar', 'baz'])(); 
}    
+0

如果你沒有說出關於Math.random()的廢話,我會提高這個數。 – Bergi

+0

D'oh,一些閱讀後糾正了我的錯誤。我認爲'Math.random()'將會是'0 <= x <= 1',但顯然是'0 <= x <1' ...所以忘了那個_being謹慎的部分:D – Tharabas