Передача параметров в функцию setInterval

Посоветуйте, пожалуйста, как передать параметры в функцию, вызываемую с помощью setInterval.

Мой пример setInterval(funca(10,3), 500); неверен.


person Rakesh    schedule 19.01.2009    source источник
comment
Синтаксис: .setInterval(func, delay[, param1, param2, ...]);   -  person O-9    schedule 09.04.2019


Ответы (18)


Вам необходимо создать анонимную функцию, чтобы фактическая функция не выполнялась сразу.

setInterval( function() { funca(10,3); }, 500 );
person tvanfosson    schedule 19.01.2009
comment
что должно быть для динамического параметра? - person rony36; 22.08.2013
comment
@ rony36 - вы, вероятно, захотите иметь функцию, которая создает для вас интервальный таймер. Передайте параметр функции, чтобы его значение было зафиксировано при закрытии функции и сохранялось до истечения таймера. function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); } Затем назовите это как createInterval(funca,dynamicValue,500); Очевидно, вы можете расширить это для более чем одного параметра. И, пожалуйста, используйте более информативные имена переменных. :) - person tvanfosson; 22.08.2013
comment
@tvanfosson: отличный ответ! Вы знаете, как очистить форму интервала внутри функции funca? - person Flo; 03.11.2016
comment
@tvanfosson Спасибо. Плохо, но на самом деле я имел в виду пример createInterval, который вы привели в разделе комментариев. Как это сработает? Я тоже думал о передаче переменной таймера в качестве динамического параметра, но не уверен, как и имеет ли это смысл. Для ясности я добавил сюда новый вопрос: stackoverflow.com/questions/40414792/ - person Flo; 04.11.2016

теперь с ES5, привязать метод Function prototype:

setInterval(funca.bind(null,10,3),500);

Ссылка здесь

person sbr    schedule 01.10.2012
comment
Это лучший ответ, однако он может иметь неожиданное поведение в зависимости от функции. например console.log.bind(null)("Log me") выбросит Illegal invocation, но console.log.bind(console)("Log me") будет работать должным образом. Это потому, что console.log требует console в качестве this arg. - person Indy; 16.02.2014
comment
Безусловно, лучший ответ. Худой и чистый. Большое спасибо! - person Tobi; 02.09.2014
comment
Очень чисто и эффективно! - person contactmatt; 02.12.2014
comment
Просто добавьте, что работает с Chrome ›= 7, Firefox› = 4.0, Explorer ›= 9, Opera› = 11.60, Safari ›= 5.1 (Источник: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/) - person Roger Veciana; 15.06.2016
comment
Ссылка MDN, предоставленная @RogerVeciana, сейчас не работает, поэтому вот обновленная ссылка - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ - person yoniLavi; 19.03.2021

Добавьте их как параметры в setInterval:

setInterval(funca, 500, 10, 3);

В синтаксисе вашего вопроса используется eval, что не является рекомендуемой практикой .

person Kev    schedule 19.01.2009
comment
Что ?! С каких это пор это разрешено? (серьезный вопрос) - person Crescent Fresh; 19.01.2009
comment
@Kev Internet Explorer - настоящий беспорядок Он не поддерживает передачу аргументов -.- - person ShrekOverflow; 28.01.2012
comment
ИМХО, это должен быть принятый ответ. Красивое, простое и чистое решение. - person LightMan; 18.12.2018

Вы можете передать параметр (ы) как свойство объекта функции, а не как параметр:

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" в приведенном выше примере будет иметь правильную область видимости.

person Juan    schedule 14.12.2011
comment
Вы можете получить доступ через Classname.prototype.someFunction.parameter1 - person JoaquinG; 15.10.2012
comment
Добавление параметров к объекту или функции может привести к замедлению работы компилятора, поскольку ему придется перестраивать представление объекта в собственном коде (например, если это было сделано в горячем цикле), поэтому будьте осторожны. - person mattdlockyer; 20.02.2014

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);

person swogger    schedule 14.07.2015
comment
Так лучше. - person Ugur Kazdal; 21.12.2019

Вы можете использовать анонимную функцию;

setInterval(function() { funca(10,3); },500);
person Simon    schedule 19.01.2009
comment
это достаточно дорогой звонок! - person RLEE; 04.02.2014
comment
@Roylee Как это дорого? - person Sebastian Simon; 24.02.2018

Безусловно, наиболее практичным ответом является тот, который дал tvanfosson, все, что я могу сделать, это дать вам обновленную версию с ES6:

setInterval( ()=>{ funca(10,3); }, 500);
person A.rodriguez    schedule 02.07.2016
comment
Вы хотите сказать, что () = ›{} - это новый способ в ES6 заменить функцию () {}? Интересно. Во-первых, я думал, что ракеты уже давно устарели. И, если этот синтаксис не имеет других общих применений, он просто очень, очень странный. Я вижу, это толстые стрелы. Тем не менее, странно. Думаю, кому-то это нравится, и это вопрос мнения. - person Richard_G; 20.11.2016

Достаточно цитирования аргументов:

OK --> reloadIntervalID = window.setInterval( "reloadSeries('"+param2Pass+"')" , 5000)

KO --> reloadIntervalID = window.setInterval( "reloadSeries( "+param2Pass+" )" , 5000)

Обратите внимание на одинарную кавычку ' для каждого аргумента.

Протестировано с IE8, Chrome и FireFox

person waterazu    schedule 25.01.2012
comment
Использование eval - ужасная практика. Намного лучше использовать анонимную функцию. - person SuperIRis; 24.07.2013

const designated = "1 jan 2021"

function countdown(designated_time){

    const currentTime = new Date();
    const future_time = new Date(designated_time);
    console.log(future_time - currentTime);
}

countdown(designated);

setInterval(countdown, 1000, designated);

Есть так много способов сделать это, лично для меня это чисто и мило.

person Allaye    schedule 17.10.2020

Я знаю, что эта тема настолько старая, но вот мое решение о передаче параметров в функции 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);
}
person Kaan Karaca    schedule 02.07.2016
comment
мне нужно получить доступ к значению один раз при вызове функции, но не каждую секунду, поэтому ваш ответ обеспечивает это (например, timer), но как вы clearInterval() в этом сценарии? - person user1063287; 29.09.2018

Это работает _1 _.... Джон Клейзер привело меня к ответу.

person Stephen    schedule 04.12.2011

Другое решение состоит в том, чтобы передать вашу функцию вот так (если у вас есть динамические переменные): setInterval ('funca (' + x + ',' + y + ')', 500);

person nonozor    schedule 16.02.2014

Вы можете использовать библиотеку под названием underscore js. Он дает красивую оболочку для метода привязки, а также гораздо более чистый синтаксис. Позволяет вам выполнять функцию в указанной области.

http://underscorejs.org/#bind

_.bind (функция, область действия, * аргументы)

person Sagar Parikh    schedule 04.03.2015

Эта проблема была бы хорошей демонстрацией использования замыканий. Идея состоит в том, что функция использует переменную внешней области видимости. Вот пример ...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

ret = function(){
    console.log("Hello, " + name);
}

return ret;
}

Функция «makeClosure» возвращает другую функцию, которая имеет доступ к переменной «name» внешней области видимости. Итак, по сути, вам нужно передать любые переменные функции "makeClosure" и использовать их в функции, назначенной переменной "ret". Фактически, setInterval будет выполнять функцию, назначенную для "ret".

person Aleksey Kanaev    schedule 02.01.2019

У меня была такая же проблема с приложением Vue. В моем случае это решение работает только в том случае, если анонимная функция объявлена ​​как стрелочная функция в отношении объявления на крючке mounted () жизненного цикла.

person Srdjan Milic    schedule 16.04.2020

Кроме того, с IE Support ›9, вы можете передавать больше переменных, установленных внутренним интервалом, которые будут использоваться вашей функцией. Например:

function myFunc(arg1, arg2){};
setInterval(myFunc, 500, arg1, arg2);

Привет!

person Samuel Diez    schedule 08.10.2020

Лучшее решение для этого ответа - следующий блок кода:

setInterval(() => yourFunction(param1, param2), 1000);
person Peter Palmer    schedule 17.07.2021

person    schedule
comment
Лучше всего объясненный ответ. - person Drk_alien; 30.08.2016
comment
Так зачем передавать аргументы в виде массивов? Эта деталь даже не имеет отношения к вопросу. - person Sebastian Simon; 24.02.2018
comment
Это то, что я искал, это должно быть на высоте - person Jonathan Aurry; 28.06.2020