Посоветуйте, пожалуйста, как передать параметры в функцию, вызываемую с помощью setInterval.
Мой пример setInterval(funca(10,3), 500); неверен.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам необходимо создать анонимную функцию, чтобы фактическая функция не выполнялась сразу.
setInterval( function() { funca(10,3); }, 500 );
что должно быть для динамического параметра?
@ rony36 - вы, вероятно, захотите иметь функцию, которая создает для вас интервальный таймер. Передайте параметр функции, чтобы его значение было зафиксировано при закрытии функции и сохранялось до истечения таймера. function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); } Затем назовите его как createInterval(funca,dynamicValue,500);. Очевидно, вы можете расширить это значение для более чем одного параметра. И, пожалуйста, используйте более информативные имена переменных. :)
@tvanfosson: отличный ответ! Вы знаете, как очистить интервал формы в функции funca?
@tvanfosson Спасибо. Мое плохое, но на самом деле я имел в виду пример createInterval, который вы привели в разделе комментариев. Как это сработает? Я тоже думал о передаче переменной таймера в качестве динамического параметра, но не уверен, как и имеет ли это смысл. Для ясности я добавил сюда новый вопрос: stackoverflow.com/questions/40414792/…
Добавьте их как параметры в setInterval:
setInterval(funca, 500, 10, 3);
В синтаксисе вашего вопроса используется eval, а не рекомендуемая практика.
Что ?! С каких это пор разрешили? (серьезный вопрос)
Точно сказать не могу. Мой источник был: developer.mozilla.org/en/DOM/window.setInterval
@Kev Internet Explorer - настоящий беспорядок Он не поддерживает передачу аргументов -.-
ИМХО, это должен быть принятый ответ. Красивое, простое и чистое решение.
Ссылка Кева теперь кажется недействительной. Информацию можно найти здесь: developer.mozilla.org/en-US/docs/Web/API/…
Спасибо @AdamMarsh, я обновил сам ответ, чтобы использовать вашу ссылку. ✔
Вы можете использовать анонимную функцию;
setInterval(function() { funca(10,3); },500);
это достаточно дорогой звонок!
@Roylee Как это дорого?
Это работает setInterval("foo(bar)",int,lang); .... Джон Кляйзер приводит меня к ответу.
Вы можете передать параметр (ы) как свойство объекта функции, а не как параметр:
var f = this.someFunction; //use 'this' if called from class
f.parameter1 = obj;
f.parameter2 = this;
f.parameter3 = whatever;
setInterval(f, 1000);
Тогда в вашей функции someFunction у вас будет доступ к параметрам. Это особенно полезно внутри классов, где область видимости автоматически переходит в глобальное пространство, и вы теряете ссылки на класс, который для начала вызвал setInterval. При таком подходе "параметр2" в "someFunction" в приведенном выше примере будет иметь правильную область видимости.
Вы можете получить доступ через Classname.prototype.someFunction.parameter1
Добавление параметров к объекту или функции может привести к замедлению работы компилятора, поскольку ему придется перестраивать представление объекта в собственном коде (например, если это было сделано в горячем цикле), поэтому будьте осторожны.
Достаточно цитирования аргументов:
OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)
KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)
Обратите внимание на одинарную кавычку ' для каждого аргумента.
Протестировано с IE8, Chrome и FireFox
Использование eval - ужасная практика. Намного лучше использовать анонимную функцию.
теперь с ES5, привязать метод Function prototype:
setInterval(funca.bind(null,10,3),500);
Это лучший ответ, однако он может иметь неожиданное поведение в зависимости от функции. например console.info.bind(null)("Log me") выбросит Illegal invocation, но console.info.bind(console)("Log me") будет работать, как ожидалось. Это потому, что console.info требует console в качестве аргумента this.
Безусловно, лучший ответ. Худой и чистый. Большое спасибо!
Очень чисто и эффективно!
Просто добавьте, что работает с Chrome> = 7, Firefox> = 4.0, Explorer> = 9, Opera> = 11.60, Safari> = 5.1 (Источник: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/…)
Ссылка MDN, предоставленная @RogerVeciana, сейчас не работает, поэтому вот обновленная - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
setInterval(function(a,b,c){
console.info(a + b +c);
}, 500, 1,2,3);
//note the console will print 6
//here we are passing 1,2,3 for a,b,c arguments
// tested in node v 8.11 and chrome 69
Лучше всего объясненный ответ.
Так зачем передавать аргументы в виде массивов? Эта деталь даже не имеет отношения к вопросу.
Это то, что я искал, это должно быть на высоте
Другое решение состоит в том, чтобы передать вашу функцию таким образом (если у вас есть динамические вары): setInterval ('funca (' + x + ',' + y + ')', 500);
Вы можете использовать библиотеку под названием underscore js. Он дает красивую оболочку для метода привязки, а также гораздо более чистый синтаксис. Позволяет вам выполнять функцию в указанной области.
_.bind (функция, область действия, * аргументы)
setInterval(function,milliseconds,param1,param2,...)
Обновление: 2018 - используйте оператор «спред»
function repeater(param1, param2, param3){
alert(param1);
alert(param2);
alert(param3);
}
let input = [1,2,3];
setInterval(repeater,3000,...input);Так лучше.
Так лучше.
Я знаю, что эта тема настолько старая, но вот мое решение о передаче параметров в функции setInterval.
HTML:
var fiveMinutes = 60 * 2;
var display = document.querySelector('#timer');
startTimer(fiveMinutes, display);
JavaScript:
function startTimer(duration, display) {
var timer = duration,
minutes, seconds;
setInterval(function () {
minutes = parseInt(timer / 60, 10);
seconds = parseInt(timer % 60, 10);
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
display.textContent = minutes + ":" + seconds;
--timer; // put boolean value for minus values.
}, 1000);
}
Мне нужно получить доступ к значению один раз при вызове функции, но не каждую секунду, поэтому ваш ответ обеспечивает это (например, timer), но как вы используете clearInterval() в этом сценарии?
Безусловно, наиболее практичным ответом является тот, который дал tvanfosson, все, что я могу сделать, это дать вам обновленную версию с ES6:
setInterval( ()=>{ funca(10,3); }, 500);
Вы хотите сказать, что () => {} - это новый способ в ES6 заменить функцию () {}? Интересно. Во-первых, я думал, что ракеты уже давно устарели. И, если этот синтаксис не имеет других общих применений, он просто очень, очень странный. Я вижу, это «толстые стрелы». Тем не менее, странно. Думаю, кому-то это нравится, и это вопрос мнения.
Эта проблема была бы хорошей демонстрацией использования замыканий. Идея состоит в том, что функция использует переменную внешней области видимости. Вот пример ...
setInterval(makeClosure("Snowden"), 1000)
function makeClosure(name) {
var ret
ret = function(){
console.info("Hello, " + name);
}
return ret;
}
Функция «makeClosure» возвращает другую функцию, которая имеет доступ к переменной «name» внешней области видимости. Итак, по сути, вам нужно передать любые переменные функции "makeClosure" и использовать их в функции, назначенной переменной "ret". Фактически, setInterval будет выполнять функцию, назначенную для "ret".
У меня была такая же проблема с приложением Vue. В моем случае это решение работает только в том случае, если анонимная функция объявлена как стрелочная функция в отношении объявления в крюке жизненного цикла mounted ().
Кроме того, с IE Support> 9 вы можете передать больше переменных, установленных внутренним интервалом, которые будут использоваться вашей функцией. Например:
function myFunc(arg1, arg2){};
setInterval(myFunc, 500, arg1, arg2);
Привет!
const designated = "1 jan 2021"
function countdown(designated_time){
const currentTime = new Date();
const future_time = new Date(designated_time);
console.info(future_time - currentTime);
}
countdown(designated);
setInterval(countdown, 1000, designated);
Есть так много способов сделать это, лично для меня это чисто и мило.
Синтаксис:
.setInterval(func, delay[, param1, param2, ...]);