2012-05-21 12 views
7

Próbuję uruchomić funkcję losową, ale nie dość zorientowaliśmy się:Jak uruchomić losowo wybraną funkcję w 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> 

a następnie:

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

Jestem na dobrej drodze?

+2

Co zwróci funkcja 'poop()'? – Marko

+0

Po prostu przyklej tam kilka eval, a będziesz złoty! +1 na funkcje kupna BTW. – adeneo

+0

Wyciąga akordy ukulele z Raphaelem! Kiedy to zrobi, wypluje losowe sekwencje akordów. – jthomasbailey

Odpowiedz

9

Jedną z opcji jest użycie window obiektu:

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

zwrócić uwagę, że należy usunąć nawiasy od nazw funkcji w tablicy.


Inną opcją jest usunięcie cytaty z wariantu powyżej funkcje wywołać bezpośrednio:

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

... ale może lepiej jest przechowywać funkcję we własnym obiekcie, a nie na globalnym. – Bergi

+0

@Bergi Prawdopodobnie tak, ale rozwiązanie będzie prawie takie samo. – VisioN

+0

Dlaczego struny? Dlaczego nie po prostu 'randomFrom ([poop, poop2, poop3])()'? – bobince

0

Można zrobić wiele sposób:

ale najłatwiej myślę wygenerować liczbę losową i wywołanie funkcji z przypadku :)

$("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; 
} 

z btn można nazwać

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

Funkcje są podobnymi wartościami. Można powiedzieć:

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

Aby uzyskać więcej informacji, patrz na http://www.yuiblog.com/blog/2010/02/24/video-crockonjs-3/ i/lub przeczytać na https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Call

Bookwise, przeczytaj Javascript: Dobrą części (120 stron)

Pomaga uczyć się JS poza jQuery:)

+1

Lepsze! Ale 'call' jest nadal zbyteczne,' randomFrom (myArray)() 'jest w porządku. – bobince

+0

To prawda, że ​​jest zbędny, bardziej przypomina osobisty wybór stylu - oznacza to, że oczekuję czegoś "możliwego do wywołania". Używam połączenia lub aplikuję zawsze, gdy żądam referencji funkcji. – Aadaam

1

Jesteś dość blisko:

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

Te funkcje są zdefiniowane w globalnym zasięgu, który zwykle jest window w przeglądarce. Możesz uzyskać do nich dostęp za pośrednictwem łańcucha, dzwoniąc na przykład window['foo']. Zwróci to samą funkcję foo (a nie wartość z wykonania).

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

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

Byłbym przegłosował to, gdybyś nie powiedział tego nonsensu o Math.random(). – Bergi

+0

D'oh, poprawił mój błąd po lekturze. Myślałem, że 'Math.random()' będzie '0 <= x <= 1' ale najwyraźniej jest' 0 <= x <1' ... więc zapomnij o tym, że ostrożnie_ część: D – Tharabas

Powiązane problemy