Задать вопрос
@safo4eg

Потеря контекста, вложенные функции?

Добрый день, изучаю 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);
    }
}
  • Вопрос задан
  • 111 просмотров
Подписаться 1 Средний 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы