.setInterval () требует, чтобы ей передавалась функция ссылка , а не операторы.
Когда компилятор JavaScript сначала читает код, оператор runRandomNumbers(numbers)
выполняется немедленно (поэтому вы получаете одно случайное число, сгенерированное и выводимое на экран), а затем возвращаемое значение из него (которое undefined
) - это то, что фактически передается и сохраняется как обратный вызов таймера.Когда таймер достигает своего интервала, вызывать нечего (undefined
), поэтому функция запускается один раз, и вы видите одно число, но тогда все.
Решение состоит в том, чтобы обернуть код, который вы хотите выполнить, в которомрегулярные интервалы в функции, так что эта ссылка на функцию может быть передана в .setInterval()
.
Кроме того, если вы хотите показать список сгенерированных чисел, вам нужно установить содержимое элемента с помощью +=
если вы хотите сохранить старое значение и просто объединить его.
ПРИМЕЧАНИЯ:
- В ваших функциях есть большое разделение, которое на самом деле не добавляет никакихзначение в коде, и, вместо этого, усложняет отслеживание.
- Используйте
.innerHTML
, только когда строка, которую вы устанавливаете / получаете, содержит HTML, потому что это заставляет браузер анализировать строку для HTML, который являетсяпустая трата ресурсов, когда нет HTML.Вместо этого используйте .textContent
для получения / установки строк, которые не содержат HTML.
var element = document.getElementById("numbers-display");
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
//This function takes a single argument and displays it in the browser.
function runRandomNumbers (array) {
element.textContent += array[Math.floor(Math.random()*10)];
}
// A function is expected as the argument here. That function
// will be stored as the callback for the timer.
function runOnInterval(callbackFunction) {
setInterval(callbackFunction, 1500);
}
// We'll pass a function as the datat for the argument
runOnInterval(function(){ runRandomNumbers(numbers) });
<div id="numbers-display"></div>