Добрый день, изучаю JS относительно недавно, столкнулся с таким недопониманием:
когда я в функции "checkFlag" отвязываю событие и в параметре указываю функцию с входным значением у меня выдаёт ошибку в случаях:
1. Если все манипуляции происходят непосредственно в normalTimer(), без вложенных и возвращенных функций, ну в этом вроде разобрался, т.к removeEventListener() должен принимать исходный код функции, а не вызывать её, верно?
2. Далее я решил сделать так, чтобы при вызове функция возвращала другую функцию и могла использовать входящие параметры во внешнюю функцию и вроде всё заработало, но я думал будет потеря контекста, ведь она же вложена в функцию normalTimer() ? Я добавил переменную let self = this, и в возвращаемой функции начал использовать self, но почему-то выдавались ошибки, после того как я удалил эту переменную и просто поставил this всё заработало корректно. Почему так? Разве тут нет потери контекста? И если нет, то почему выдаёт ошибку, если я указываю у внешней переменной let self = this и использую self, а не this, разницы же не должно быть?
function normalTimer(speed) {
return function() {
timerSpeed = 1000;
clearInterval(timerId);
timerId = setInterval(counterTimerVar1, timerSpeed);
this.removeEventListener('click', normalTimer(speed));
if(speed === 100) {
fastFlag = 0;
this.addEventListener('click', fastTimer);
} else if (speed === 4000) {
slowFlag = 0;
this.addEventListener('click', slowTimer);
}
}
}
function checkFlag() {
if(fastFlag === 1) {
fastFlag = 0;
fast.removeEventListener('click', normalTimer(100));
fast.addEventListener('click', fastTimer);
} else if(slowFlag === 1) {
slowFlag = 0;
slow.removeEventListener('click', normalTimer(4000));
slow.addEventListener('click', slowTimer);
}
}