Доброго времени суток, коллеги! Сабж. Возьмем пример:
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.
Исходя из логики замыкания -- переменная из внешнего лексического окружения вызывается, если во внутреннем лексическом окружении она отсутствует. Соответственно, поскольку переменная не была взята из внешнего лексического окружения -- она уже есть у обычной анонимной функции. У стрелочной же ее нет по определению, поэтому она берет ее из внешнего лексического окружения.
Напрямую об этом нигде не нашел, но есть такое предположение. Прошу поправить, если я неправ.