@Xveeder

Почему анонимная функция не замыкается на лексическое окружения метода класса?

Доброго времени суток, коллеги! Сабж. Возьмем пример:

class Downloader {
    
    printer(value) {
        console.log(value)
    }

    downloadAll (links) {
        for (const link of links) {
            setTimeout(function() { this.printer(link) }, 1000); 
        } 
  }
}

let downloader = new Downloader();
downloader.downloadAll(["one", "two"]); // TypeError: this.printer is not a function


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

Исходя из логики замыкания -- переменная из внешнего лексического окружения вызывается, если во внутреннем лексическом окружении она отсутствует. Соответственно, поскольку переменная не была взята из внешнего лексического окружения -- она уже есть у обычной анонимной функции. У стрелочной же ее нет по определению, поэтому она берет ее из внешнего лексического окружения.

Напрямую об этом нигде не нашел, но есть такое предположение. Прошу поправить, если я неправ.
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Вы не нашли, видимо, потому, что намудрили с терминологией.
А так в любом учебнике написано, что в «обычной» функции this резолвится на этапе вызова, а к стрелочной прибивается гвоздями из контекста на этапе её определения.
В общем: this ведёт себя особым образом и на него принципы замыкания не распространяются.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ddv88
@ddv88
Binance Futures
Вкратце.
downloadAll (links) {
        let _this = this;
        for (const link of links) {
            setTimeout(function() { _this.printer(link) }, 1000); 
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы