2016-07-27 2 views
0

У меня есть массив с функциями: var ranArray = [funct1(), funct2()] и сами функции:Как остановить функции от запуска, пока они не призывается Javascript

function funct1() { 
    document.write("hello"); 
}; 
function funct2() { 
    document.write("hi"); 
}; 

Я пытаюсь сделать так, чтобы каждый раз, когда кнопка нажата, либо funct1 или funct2. Однако, без меня даже нажав кнопку, на странице я вижу свою кнопку и «hellohi». Вот функция рандомизации:

function getFunctions() { 
    return ranArray[Math.floor(Math.random * ranArray.length)]; 
}; 

и вот HTML:

<button type="button" name="ranButton" id="ranButton" onclick="getFunctions();">Random Button</button> 

ответ

1

Ваше объявление массива на самом деле вызова funct1 и funct2 и пытается сохранить возвращаемые значения в массиве. То, что вы хотите, - это набор функций. Удалите круглые скобки, чтобы сами функции сохранялись в массиве, а не возвращаемые значения. Он должен выглядеть следующим образом:

var ranArray = [funct1, funct2]; 
2

Во-первых, вам нужно хранить ссылки функции ([funct1, funct2]), то () будет немедленно вызывать функции. Затем вы можете использовать .call() для вызова функции или просто добавить () в конце ranArray[Math.floor(Math.random() * ranArray.length)] как @ jfriend00 указан. Также обратите внимание, что Math.random должно быть Math.random().

var ranArray = [funct1, funct2]; 

    function funct1() { 
    document.write("hello"); 
    }; 
    function funct2() { 
    document.write("hi"); 
    }; 

    function getFunctions() { // Note you don't really need a 'return' here 
    return ranArray[Math.floor(Math.random() * ranArray.length)](); 
    }; 

Demo


Кроме того, использование document.write() здесь является перезапись DOM. Поэтому я не рекомендую его, скорее, вы захотите разместить этот контент внутри элемента. Если у вас есть какой-то элемент ид #foo вы можете вместо этого установить текст этого DOM элемента:

document.getElementById("foo").textContent = "..."; 

Demo 2

+0

Там нет причин для '.call()' здесь. Вы можете просто использовать 'return ranArray [Math.floor (Math.random() * ranArray.length)]();' – jfriend00

+0

@ jfriend00 Действительно? Я бы не ожидал, что это сработает. Я отредактирую его, спасибо за это. –

+0

Результат индексации в вашем массиве - это ссылка на функцию, поэтому просто добавление '()' на конце вызовет эту функцию. – jfriend00

Смежные вопросы