перечислю все известные мне способы решения "детских" проблем с this. Почему детских? Потому, что разработчики со стажем знают, что this в JS -- динамический.
1) используя замыкание (об этом писали здесь выше)
function foo() {
const that = this
setTimeout(function () {
console.log(that)
})
}
2)
используя привязку контекста и каррирование -- .bind()
function foo() {
setTimeout(function () {
console.log(this)
}.bind(this))
}
3)
явное указание контекста -- .apply() .call()
function foo() {
console.log(this)
}
foo.call(/*ctx*/)
foo.apply(/*ctx*/)
4)
используя arrow function
function foo() {
setTimeout(_ => {
console.log(this)
})
}
5) используя классы TypeScript (если я правильно помню, могу ошибаться)