Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передача this в качестве параметра в функцию setTimeout (https://javascript.ru/forum/misc/72555-peredacha-v-kachestve-parametra-v-funkciyu-settimeout.html)

alecto 07.02.2018 20:26

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

помогите пожалуйста, не получается разобраться, делаю так:

var fnCounter = function() {
  var tempButton = this.innerHTML;
  this.innerHTML = 'Added';
  setTimeout(fnRestore(this.innerHTML), 1000);
};

function fnRestore(elem) {
  alert(elem);
  elem = "222";
}


elem в функции fnRestore при этом имеет значение "Added", т.е. this.innerHTML был передан в функцию в качестве параметра.
но
elem = "222";
не меняет текст нажатой кнопки.

кроме того fnRestore почему-то срабатывает сразу, а не через 1сек.


если вызывать таймер таким образом
setTimeout(fnRestore, 1000, this.innerHTML);

то функция fnRestore срабатывает через 1сек, но с тем же результатом - я не могу присвоить текст кнопке внутри функции fnRestore.

рони 07.02.2018 21:03

alecto,
10001 тема про this и setTimeout ... ждите или ищите ссылку на ближайшую тему про это.

alecto 07.02.2018 21:08

я находил и на вашем сайте и другие примеры, но код не работает.

рони 07.02.2018 21:13

alecto,
пока рабочий пример
<div id="test" >click</div>
 <script>
var fnCounter = function() {
  var tempButton = this;
  this.innerHTML = 'Added';
  setTimeout(function() {
   fnRestore(tempButton)
}, 1000);
};

function fnRestore(elem) {
  elem.innerHTML = '222';
}
test.addEventListener('click', fnCounter, false)
</script>

рони 07.02.2018 21:24

alecto,
Цитата:

Сообщение от nerv_
способы решения "детских" проблем с this

медитровать тут

alecto 07.02.2018 21:46

рони,
спасибо огромное!
заработало!

я так понял, что моя ошибка была в том, что я использовал
var tempButton = this.innerHTML;

вместо
var tempButton = this;


и функция fnRestore передается внутри анонимной функции
function() {
    fnRestore(tempButton)
  }


я только не понимаю, в чем разница, если синтаксис setTimeout:
setTimeout(func, 1000);

но первоначальный вариант
setTimeout(fnRestore(this.innerHTML), 1000);

работает неправильно.
из-за параметра?
потому что
setTimeout(fnRestore, 1000, tempButton);

работает корректно.

рони 07.02.2018 22:19

Цитата:

Сообщение от alecto
setTimeout(fnRestore(this.innerHTML), 1000);

здесь нет функции fnRestore!!! есть только её результат, функция уже "отработала", прежде чем попасть в setTimeout

рони 07.02.2018 22:23

alecto,
Пример потери контекста

alecto 07.02.2018 22:42

я как раз пробовал Решение 1: сделать обёртку, но не добился результата.
еще раз спасибо, внимательно перечитаю материал по ссылке.


Часовой пояс GMT +3, время: 03:55.