2015-03-03 4 views
2

Мне интересно, как создать массив с функциями, а затем рандомизировать его и называть его. Вот пример того, что я тестировал.Javascript function array

functions = [f1(), f2(), f3(), f4()]; 
 
rand = functions[Math.floor(Math.random() * functions.length)]; 
 

 
$('p').click(function() { 
 
    rand[0](); 
 
}

Я искал и пытался несколько предполагаемых решений, но ни один из них не работал (в том числе и этот: Javascript Array of Functions).

ответ

5

Создание массива с помощью ссылки функций, а затем использовать генерацию случайных ключей в обработчик щелчка

function log(func) { 
 
    $('#x').html(func) 
 
} 
 

 
function f1() { 
 
    log('f1') 
 
} 
 

 
function f2() { 
 
    log('f2') 
 
} 
 

 
function f3() { 
 
    log('f3') 
 
} 
 

 
function f4() { 
 
    log('f4') 
 
} 
 

 
functions = [f1, f2, f3, f4]; 
 

 
$('p').click(function() { 
 
    var rand = functions[Math.floor(Math.random() * functions.length)]; 
 
    rand(); 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div id="x"></div> 
 
<p>Click</p>

+0

Могу ли я спросить, что точка функции журнала и x div есть? Пробовал это без них, и он отлично работает. Спасибо, кстати. – ItsNotAbyss

+0

@ItsNotAbyss, который должен был просто продемонстрировать, что функции вызываются ... например, когда 'f1' называется текстом div, изменяется на f1 и т. Д. –

0
  1. Добавляя () после имени функции (f1()), вы эффективно выполнение функция. Вы должны передать ссылку функции в массив, чтобы впоследствии ее вызывать. Так,

    functions = [f1(), f2(), f3(), f4()]; 
    

    становится

    functions = [f1, f2, f3, f4]; 
    
  2. Вы, кажется, вычисления rand только один раз, потому что она не помещается в click события. Включите это,

    rand = functions[Math.floor(Math.random() * functions.length)]; 
    

    в вашем обработчике событий.

  3. rand не является массивом. Он содержит ссылку на одну функцию, которая может быть вызвана, называя его, как это:

    rand(); 
    

Ваш полный код, наряду с некоторыми дополнениями был повозился здесь: http://jsfiddle.net/sq623mrc/