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.