Uruchamianie metody z poziomu innej metody a słowo this

Uruchamianie metody z poziomu innej metody a słowo this
Pan Herbaciarz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 42
0

Cześć, mam problem z poniższym kodem:

Kopiuj

function x () {
  console.log('Tekst');
}

class MojaKlasa {
    constructor (parametr) {
        this.parametr = parametr;
    }

    funkcja () {
        this.parametr();
    }

    start () {
        setInterval(this.funkcja,100);
    }
}

var app = new MojaKlasa (x);
app.start();

po wykonaniu wewnątrz "funkcja" otrzymuję błąd

Kopiuj
Uncaught TypeError: this.parametr is not a function at funkcja

Jak powinienem poprawić swój kod?
Pozdrawiam.

LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8488
1

problem jest tutaj

Kopiuj
  setInterval(this.funkcja,100);

podając this.funkcja do setInterval tracisz wiązanie z this. Funkcja setInterval dostaje samą funkcję bez obiektu. To się w JS uruchamia w podobny sposób jakbyś zapisał:

Kopiuj
var funkcja =  this.funkcja;
setInterval(funkcja,100);

czyli jak się wywołuje funkcja to już this będzie co innego (możesz to sprawdzić dodając console.log(this) w funkcji funkcja).

Żeby utrzymać this możesz użyć np. metody bind:

Kopiuj
  setInterval(this.funkcja.bind(this),100);
AD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 488
1

W setInteval funkcja jest wywoływana w innym kontekście i this nie odnosi się już do instancji Twojej klasy. Możesz użyć zbindowanej funkcji lub np. arrow function, ale gdy Twoim celem jest jedynie zbindowanie contextu, to bind będzie lepszym wyjściem.

ST
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0

Nie wiem czemu this.parametr wywołujesz jako funkcję.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.