2012-05-21 10 views
7

Estoy tratando de ejecutar una función aleatoria, pero no se han dado cuenta bastante:¿Cómo ejecutar una función seleccionada al azar en 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> 

y luego:

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

estoy en el camino correcto?

+2

¿Qué devuelve la función 'poop()'? – Marko

+0

¡Solo incluye algunas evaluaciones y estarás dorado! +1 en la popa funciona por cierto. – adeneo

+0

¡Dibuja acordes de ukelele con Raphael! Cuando esté listo escupirá progresiones de acordes al azar. – jthomasbailey

Respuesta

9

Una opción es utilizar window objeto:

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

Tener en cuenta que se debe eliminar paréntesis, a partir de los nombres de función en la matriz.


Otra opción es eliminar las cotizaciones de la variante de arriba y llamar a funciones directamente:

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

... pero quizás sea mejor almacenar la función en su propio objeto, no en el global. – Bergi

+0

@Bergi Posiblemente sí, pero la solución será casi la misma. – VisioN

+0

¿Por qué las cuerdas? ¿Por qué no simplemente 'randomFrom ([poop, poop2, poop3])()'? – bobince

0

Usted puede hacer esto mucho manera:

Pero el más fácil de pienso para generar un número aleatorio y llamar a funciones con el 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 puede llamar

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

Las funciones son como valores. Se podría decir:

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

Para obtener más información, mira http://www.yuiblog.com/blog/2010/02/24/video-crockonjs-3/ y/o leer en https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Call

BookWise, leer Javascript: las partes buenas (120 páginas)

ayuda a aprender JS fuera de jQuery:)

+1

¡Mejor! Pero la 'llamada' todavía es superflua,' randomFrom (myArray)() 'está bien. – bobince

+0

Es cierto que es superfluo, es más como una elección personal de estilo, denota que espero algo "invocable". Uso call o apply siempre cuando solicito referencias de funciones. – Aadaam

1

Eres muy cerca:

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

Estas funciones se definen según el alcance global, que generalmente es window dentro de un navegador. Puede acceder a ellos a través de una cadena llamando al window['foo'] por ejemplo. Eso devolverá la función foo en sí (no el valor de ejecución).

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

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

Habría dado la vuelta a esto si no dijeses esa tontería sobre Math.random(). – Bergi

+0

D'oh, corrigió mi error después de leerlo un poco. Pensé 'Math.random()' sería '0 <= x <= 1' pero aparentemente es' 0 <= x <1' ... así que olvídate de eso _ser cuidadosa_parte: D – Tharabas

Cuestiones relacionadas