Это поведение связано с областями видимости, функциями стрелок, this
и с тем, как работают функции / объекты Javascript.
Функции в JavaScript выполняются в определенном контексте, а использование this
обеспечивает доступ к текущему контексту.this.counter
в примере кода недоступно / не определено внутри функции setInterval()
, поэтому мы получаем undefined
.
Теперь, в Функции стрелок , вещи особенные / разные.Функции со стрелками всегда лексически связывают контекст (Lexical Scoping означает, что он использует this
из кода, содержащего функцию со стрелкой.) И поэтому this
будет ссылаться на исходный контекст, то есть на класс.
AБолее простой пример может сделать его более понятным.
const obj = {
myVar: 'foo',
myFunc: function() {
console.log('Actual Variable value: ',this.myVar)
setTimeout(() => {
console.log('Set timeout using Arrow function: ',this.myVar)
}, 1000);
setTimeout(function () {
console.log('Set timeout using Normal function: ',this.myVar)
}, 1000);
}
}
obj.myFunc();
Вывод
Actual Variable value: foo
Set timeout using Arrow function: foo
Set timeout using Normal function: undefined
Подробнее
- Функции стрелок
- это ключевое слово