Sobes.tech
Middle

class Foo { bar = 1; bla = () => console.log(this.bar); baz = function () {console.log(this.bar);}; } new Foo().bla(); new Foo().baz(); Dites-le simplement ainsi : `this` n'est pas une portée, mais le contexte d'appel de la fonction. Il est défini non pas là où la fonction est déclarée, mais là où elle est appelée. On peut ajouter 3-4 règles : - Appel normal d'une fonction — `this` est généralement undefined en mode strict. - Méthode d'un objet — `this` indique l'objet à gauche du point. - `call / apply / bind` — permettent de définir explicitement `this`. - Fonctions fléchées — n'ont pas leur propre `this`, elles prennent celui du contexte extérieur.

sobes.tech IA

Réponse de l'IA

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.