2012-05-21 11 views
7

Sto cercando di eseguire una funzione casuale, ma non sono del tutto capito:Come eseguire una funzione selezionata in modo casuale in 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> 

e poi:

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

Sono sulla strada giusta?

+2

Cosa restituisce la funzione 'poop()'? – Marko

+0

Basta incollare qualche eval lì dentro e sarai d'oro! +1 sulle funzioni di cacca BTW. – adeneo

+0

Disegna accordi di ukulele con Raffaello! Al termine sputerà progressioni di accordi casuali. – jthomasbailey

risposta

9

Una possibilità è quella di utilizzare window oggetto:

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

attenzione che si dovrebbe rimuovere parentesi da nomi delle funzioni nella matrice.


Un'altra opzione è quella di rimuovere le citazioni dalla variante di cui sopra e le funzioni di chiamare direttamente:

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

... ma forse è meglio memorizzare la funzione nel proprio oggetto, non in quello globale. – Bergi

+0

@Bergi Forse sì ma la soluzione sarà quasi la stessa. – VisioN

+0

Perché le stringhe? Perché non solo 'randomFrom ([poop, poop2, poop3])()'? – bobince

0

Si può fare questo molti modo:

Ma il più facile penso che per generare un numero casuale e chiamare funzioni con il caso :)

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

con BTN è possibile chiamare

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

Le funzioni sono valori simili. Si potrebbe dire:

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

Per maggiori informazioni, guarda http://www.yuiblog.com/blog/2010/02/24/video-crockonjs-3/ e/o leggere a https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Call

Bookwise, leggere JavaScript: le parti buone (120 pagine)

Aiuta a imparare JS esterno jQuery:)

+1

Meglio! Ma il 'call' è ancora superfluo,' randomFrom (myArray)() 'sta bene. – bobince

+0

È vero che è superfluo, è più una scelta personale di stile - significa che mi aspetto qualcosa di "callable". Uso call o apply sempre quando si richiedono riferimenti alle funzioni. – Aadaam

1

Sei abbastanza vicino:

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

Queste funzioni sono definite nell'ambito globale, che di solito è window all'interno di un browser. È possibile accedervi tramite stringa chiamando ad esempio window['foo']. Ciò restituirà la funzione foo stessa (non il valore dall'esecuzione).

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

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

Avrei svalutato questo se non avessi detto sciocchezze su Math.random(). – Bergi

+0

D'oh, corretto il mio errore dopo qualche lettura. Pensavo che 'Math.random()' sarebbe '0 <= x <= 1' ma apparentemente è' 0 <= x <1' ... quindi dimentica che _being careful_ part: D – Tharabas

Problemi correlati