ID: 2929 OOP - Podstawy Średnie

Źródło: Arkusze CKE

Co będzie wynikiem działania poniższego kodu JavaScript?
const obj = {
name: 'John',
greet: function() {
setTimeout(function() {
console.log(Hello, ${this.name});
}, 1000);
}
};
obj.greet();

Warianty odpowiedzi

  1. A

    TypeError

  2. B

    Hello, null

  3. C

    Hello, John

  4. D

    Hello, undefined

Wyjaśnienie

To tradycyjna pułapka związana z zachowaniem słowa kluczowego this w zwykłych funkcjach w JavaScript.

Funkcja przekazana do setTimeout wykonywana jest po upływie czasu jako osobne wywołanie. Zwykła funkcja ustalana w ten sposób traci kontekst obiektu obj i jej this zaczyna wskazywać na obiekt globalny (np. window w przeglądarce).

W obiekcie globalnym właściwość name nie istnieje, więc wyrażenie this.name zwraca undefined. Na konsoli pojawi się tekst Hello, undefined.

Gdyby wewnątrz setTimeout użyto funkcji strzałkowej (() => {}), zachowałaby ona prawidłowy kontekst this z obiektu obj i kod wypisałby Hello, John.

Sprawdź się w praktyce

Rozwiąż pełny test próbny INF.04 albo wylosuj pojedyncze pytanie na szybką powtórkę.

Podobne pytania — OOP - Podstawy