Почему setInterval вызывает функцию со случайными аргументами?
-
01-07-2019 - |
Вопрос
Итак, я сталкиваюсь с любопытной проблемой.Если у меня есть функция
// counter wraps around to beginning eventually, omitted for clarity.
var counter;
cycleCharts(chartId) {
// chartId should be undefined when called from setInterval
console.log('chartId: ' + chartId);
if(typeof chartId == 'undefined' || chartId < 0) {
next = counter++;
}
else {
next = chartId;
}
// ... do stuff to display the next chart
}
Эта функция может быть вызвана явно действием пользователя, и в этом случае chartId
передается в качестве аргумента, и отображается выбранная диаграмма;или он может находиться в режиме автозапуска, и в этом случае он вызывается setInterval
который инициализируется следующим образом:
var cycleId = setInterval(cycleCharts, 10000);
Самое странное, что я действительно вижу cycleCharts()
получить chartId
аргумент, даже если он вызывается из setInterval
!Тот Самый setInterval
даже не имеет никаких параметров для передачи в cycleCharts
функция, так что я очень озадачен тем, почему chartId
не является неопределенным, когда cycleCharts
вызывается из setInterval
.
Решение
setInterval загружает в cycleCharts фактические временные данные ( так что можно вычислить фактическое время его выполнения и использовать для получения менее высокопарного ответа, в основном практичного в анимации)
ты хочешь
var cycleId = setInterval(function(){ cycleCharts(); }, 10000);
(это поведение может быть не стандартизировано, поэтому не полагайтесь на него слишком сильно)
Другие советы
Он сообщает вам, на сколько миллисекунд задерживается обратный вызов.
var cycleId = setInterval(цикловые диаграммы, 10000, 4242);
Начиная с третьего параметра и далее - они передаются в функцию, поэтому в моем примере вы отправляете 4242 в качестве идентификатора диаграммы.Я знаю, что это может быть не ответ на поставленный вами вопрос, но это может быть решением вашей проблемы?Я думаю, что значение, которое он получает, является просто случайным из всего, что находится в стеке во время передачи / вызова метода.