Выбор ответа Junior Классы и интерфейсы обновлено

Метод без объекта

Вопрос

Что произойдёт?

class Counter {
  count = 0;
  inc() { this.count++; }
}
const c = new Counter();
const f = c.inc;
f();

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Компилируется, в рантайме TypeError: this равен undefined. Методы не привязаны к объекту.

Варианты ответа

  1. Компилируется, а в рантайме увеличится globalThis.count
  2. Компилируется, а c.count станет 1, как при вызове c.inc()
  3. Ошибка компиляции: метод нельзя присвоить в переменную
  4. Компилируется, в рантайме TypeError: this равен undefinedправильный ответ

Разбор

Методы не привязаны к объекту. При вызове f() без объекта слева от точки this внутри равен undefined: тело класса всегда выполняется в строгом режиме. Чтение this.count падает с TypeError. TypeScript по умолчанию это не ловит.

globalThis был бы только в нестрогом режиме, а в классах его не бывает. Лечится стрелочным полем inc = () => { this.count++ }, bind или явным параметром this: Counter в сигнатуре метода.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.