Sobes.tech
Middle

class Foo { bar = 1; bla = () => console.log(this.bar); baz = function () {console.log(this.bar);}; } new Foo().bla(); new Foo().baz(); Πείτε το σύντομα ως εξής: `this` δεν είναι πεδίο ορατότητας, αλλά το πλαίσιο κλήσης της λειτουργίας. Ορίζεται όχι εκεί που δηλώνεται η λειτουργία, αλλά εκεί που καλείται. Μπορείτε να προσθέσετε 3-4 κανόνες: - Συνήθης κλήση λειτουργίας — το `this` είναι συνήθως undefined σε αυστηρή λειτουργία. - Μέθοδος αντικειμένου — το `this` δείχνει στο αντικείμενο στα αριστερά της τελείας. - `call / apply / bind` — επιτρέπουν να ορίσετε ρητά το `this`. - Βέλη συναρτήσεις — δεν έχουν το δικό τους `this`, το παίρνουν από το εξωτερικό πλαίσιο.

sobes.tech AI

Απάντηση από AI

this — это не область видимости, а контекст вызова функции. Он определяется не там, где функция объявлена, а там, как она вызвана.

Правила:

  • Обычный вызов функции — this обычно undefined в strict mode.
  • Метод объекта — this указывает на объект слева от точки.
  • call / apply / bind — позволяют явно задать this.
  • Стрелочные функции — своего this не имеют, берут его из внешнего контекста.

В твоём примере:

class Foo {
  bar = 1;
  bla = () => console.log(this.bar); // стрелочная, this берётся из Foo
  baz = function () {console.log(this.bar);}; // обычная функция, this зависит от вызова
}

new Foo().bla(); // this — экземпляр Foo, выведет 1
new Foo().baz(); // this — тоже экземпляр Foo, выведет 1

Здесь baz вызывается как метод объекта, поэтому this — экземпляр класса. Если бы baz вызвать отдельно, например, const f = new Foo(); const fn = f.baz; fn(); — тогда this был бы undefined.