Передайте параметри у функції setInterval


320

Будь ласка, порадьте, як передавати параметри у функцію, яку називають за допомогою setInterval.

Мій приклад setInterval(funca(10,3), 500);неправильний.


2
Синтаксис:.setInterval(func, delay[, param1, param2, ...]);
O-9, 9

Відповіді:


543

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

setInterval( function() { funca(10,3); }, 500 );

4
що має бути для динамічного параметра?
rony36

28
@ rony36 - ви, мабуть, хочете мати функцію, яка створює для вас таймер інтервалу. Передайте параметр функції, щоб його значення було зафіксовано під час закриття функції та збережене протягом, коли таймер закінчиться. function createInterval(f,dynamicParameter,interval) { setInterval(function() { f(dynamicParameter); }, interval); }Потім зателефонуйте як createInterval(funca,dynamicValue,500); Очевидно, ви можете розширити це на більш ніж один параметр. І, будь ласка, використовуйте більш описові назви змінних. :)
tvanfosson

@tvanfosson: приголомшлива відповідь! Чи знаєте ви, як очистити інтервальну форму в межах функції funca?
Flo

@tvanfosson Дякую Моє погано, але я насправді мав на увазі приклад createInterval, який ви подали в розділі коментарів. Як би це працювало на це? Я думав також передати змінну таймера як динамічний параметр, але не впевнений, як чи якщо це має сенс. В інтересах ясності я додав новий питання тут: stackoverflow.com/questions/40414792 / ...
Flo

78

тепер з ES5, метод зв'язування Прототип функції:

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

Довідка тут


2
Це найкраща відповідь, однак це може мати несподіване поведінку залежно від функції. наприклад console.log.bind(null)("Log me"), кине Illegal invocation, але console.log.bind(console)("Log me")буде працювати, як очікувалося. Це тому, що console.logвимагає consoleяк thisаргумент.
Інді

1
На сьогодні найкраща відповідь. Похилий і чистий. Дуже дякую!
Тобі

Дуже чисто і ефективно!
contactmatt

2
Просто додайте, що працює з Chrome> = 7, Firefox> = 4.0, Explorer> = 9, Opera> = 11.60, Safari> = 5.1 (Джерело: developer.mozilla.org/ca/docs/Web/JavaScript/Reference/… )
Роджер Весіана

60

Додайте їх як параметри до setInterval:

setInterval(funca, 500, 10, 3);

Синтаксис у вашому запитанні використовує eval, що не рекомендується.


2
Whaa ?! З коли це було дозволено? (серйозне питання)
Crescent Fresh

1
Не впевнений. Моє джерело було: developer.mozilla.org/uk/DOM/window.setInterval
Кев

2
@Kev Internet Explorer - справжній безлад. Він не підтримує передачі аргументів -.-
ShrekOverflow

1
ІМХО, це має бути прийнятою відповіддю. Приємне, просте і чисте рішення.
LightMan

32

Параметри (и) можна передавати як властивість об'єкта функції, а не як параметр:

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" у "деякійФункції", у наведеному вище прикладі, матиме правильну область застосування.


1
Ви можете отримати доступ за Classname.prototype.someFunction.parameter1
JoaquinG

2
Додавання параметрів до об'єкта чи функції може призвести до уповільнення компілятора, оскільки йому доведеться перебудувати його власне представлення коду об'єкта (наприклад, якщо це було зроблено у гарячому циклі), тому будьте обережні.
mattdlockyer

22
     setInterval(function(a,b,c){

          console.log(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

Найкраща пояснена відповідь.
Drk_alien

То навіщо передавати аргументи як масиви? Ця деталь навіть не стосується питання.
користувач4642212

18

Ви можете використовувати анонімну функцію;

setInterval(function() { funca(10,3); },500);

1
це досить дорогий дзвінок!
Рой Лі

2
@Roylee Як це дорого?
user4642212

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


Це набагато краще.
Угур Каздаль

Це набагато краще.
Угур Каздаль

11

На сьогодні найбільш практична відповідь - це та, яку дає tvanfosson, і все, що я можу зробити, це надати вам оновлену версію з ES6:

setInterval( ()=>{ funca(10,3); }, 500);

1
Ви хочете сказати, що () => {} це новий спосіб ES6 замінити функцію () {}? Цікаво. По-перше, я думав, що ракети проходять. І, якщо цей синтаксис не має інших загальних застосувань, це просто дуже, дуже дивно. Я бачу, що вони "жирові стріли". Все-таки дивно. Я думаю, комусь це подобається, і це питання думки.
Richard_G

6

Цитування аргументів має бути достатньо:

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

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

Зверніть увагу на єдину цитату ' для кожного аргументу.

Тестовано на IE8, Chrome та FireFox


7
Використання eval - жахлива практика. Використання анонімної функції набагато краще.
SuperIRis

1

Я знаю, що ця тема настільки стара, але ось моє рішення щодо передачі параметрів у 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()у цьому сценарії?
користувач1063287

0

Це працює setInterval("foo(bar)",int,lang);.... Джон Клейзер привів мене до відповіді.


0

Інше рішення полягає у передачі вашої функції так (якщо у вас є динамічні зміни): setInterval ('funca (' + x + ',' + y + ')', 500);


0

Ви можете використовувати бібліотеку під назвою підкреслення js. Це дає гарну обгортку методом прив’язки, а також є набагато чистішим синтаксисом. Дозволяє виконувати функцію у вказаному обсязі.

http://underscorejs.org/#bind

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


0

Ця проблема була б гарною демонстрацією щодо використання закриттів. Ідея полягає в тому, що функція використовує змінну зовнішньої області. Ось приклад ...

setInterval(makeClosure("Snowden"), 1000)

function makeClosure(name) {
var ret

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

return ret;
}

Функція "makeClosure" повертає ще одну функцію, яка має доступ до зовнішньої змінної області "name". Отже, по суті, вам потрібно передати будь-які змінні функції "makeClosure" та використовувати їх у функції, призначеній змінній "ret". Афективно setInterval виконає функцію, призначену на "ret".


0

У мене була така ж проблема з додатком Vue. У моєму випадку це рішення працює лише в тому випадку, якщо анонімна функція оголошена функцією стрілки, що стосується оголошення на mounted ()гачку життєвого кола.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.