setTimeout. передача параметра функции в функцию

276
08 мая 2017, 01:43

Доброго времени суток. К делу. При запуске функции setTime,в нее передаем input, куда выводиться время. вопрос. при повторном вызове через таймер, obj не определяется. и даже если inputs через var определить не работает. только таким образом. вот. код

var id_inter;
    var go = true;
    function setTime(obj) {
      data = new Date()
      hours = data.getHours();
      mins = data.getMinutes();
      secs = data.getSeconds();
      if (hours < 10) {
        hours = "0" + hours;
      }
      if (mins < 10) {
        mins = "0" + mins;
      }
      if (secs < 10) {
        secs = "0" + secs;
      }
      time = hours + ":" + mins + ":" + secs;
      obj.value = " " + time;
      id_inter = setTimeout('setTime(obj)', 1000);
    }
    function stopTime(obj) {
      clearTimeout(id_inter);
      obj.value = "";
    }
    function times(input_form) {
      if (go) {
        setTime(input_form);
        go = false;
        document.data.start.value = "Стоп";
      } else {
        stopTime(input_form);
        go = true;
        document.data.start.value = "Старт";
      }
    }

Если писать вместо

obj.value = " " + time;
id_inter = setTimeout('setTime(obj)', 1000);

так:

inputs = obj;
id_inter = setTimeout('setTime(inputs)', 1000);

то всё работает.

Почему?

https://jsfiddle.net/jL3fhLd3/4/

Answer 1

Когда вы пишите setTimeout('setTime(obj)', 1000); - ваша setTime(obj) исполняется в глобальной области видимости, где нет никакого obj.

Когда вы пишите inputs = obj - вы создаете глобальную переменную, потому и setTimeout('setTime(inputs)', 1000); работает. Но в случае нескольких таймеров все поломается - потому что глобальная переменная только одна.

Правильно же передавать в setTimeout не строку - а функцию:

setTimeout(function() {
  setTime(obj);
}, 1000);

Или более коротко если интересуют только свежие браузеры:

setTimeout(() => setTime(obj), 1000);

Также можно воспользоваться формой setTimeout с передачей дополнительных аргументов:

setTimeout(setTime, 1000, obj);
READ ALSO
При выборе опции - свернуть список и отобразить выбранный элемент

При выборе опции - свернуть список и отобразить выбранный элемент

Нужно что бы при выборе одного элемента из списка сам список сворачивался, а элемент стал на место <span>

268
Конфликт скриптов?

Конфликт скриптов?

Делаю очередной сайт на Modx+Shopkeeper

259
MagnificPopup, инит после загрузки страницы

MagnificPopup, инит после загрузки страницы

Да, вопрос был этот уже несколько раз "инициализация попап после загрузки страницы", но в чем проблема, все как в документации

400
Почему неправильно отображается шрифт Museo Sands в IE11?

Почему неправильно отображается шрифт Museo Sands в IE11?

Подскажите, почему в IE 11 не отображаются некоторые шрифты?

335