03

this и контекст

this задаёт вызов. Стрелка и bind из этого правила выпадают.

У обычной функции this определяется не тем, где она написана, а тем, как её вызвали. Четыре формы вызова дают четыре разных результата:

  • obj.method() — this это obj.
  • Вызов без точки — this теряется: undefined в strict-режиме, глобальный объект без него.
  • call и apply подставляют this на один вызов, apply дополнительно раскладывает массив в аргументы.
  • bind возвращает новую функцию с уже зафиксированным this.

Два следствия, на которых чаще всего спотыкаются. Метод, вынутый из объекта и переданный колбэком, теряет объект — он вызывается без точки. И повторный bind первый не перебивает: inner уже зафиксирован, второй bind ничего не меняет.

Стрелка не имеет своего `this`

Стрелка берёт this снаружи, из места, где написана, даже если её вызвали как метод. Поэтому она удобна для колбэков внутри метода и не годится там, где нужен собственный this.

`new`

new создаёт объект, связывает его с this и с prototype функции. Если конструктор вернул примитив, он игнорируется и результатом остаётся созданный объект.

  1. 3.1Метод, оторванный от объекта
  2. 3.2Стрелка не имеет своего this
  3. 3.3Повторный bind и отдельный call
  4. 3.4new связывает this и прототип
  5. 3.5Колбэк setTimeout: функция против стрелки
  6. 3.6forEach внутри метода
  7. 3.7Метод уехал в map без хозяина
  8. 3.8bind каррирует аргументы
  9. 3.9apply, call со spread и обычный вызов
  10. 3.10Геттер и потерянный this
  11. 3.11Метод класса через обёртку
  12. 3.12Стрелка и обычная функция рядом в методе
  13. 3.13Конструктор вернул объект
  14. 3.14IIFE: свой strict внутри нестрогого файла
  15. 3.15Reflect.apply и строгая функция
  16. 3.16bind не спасает от new
  17. 3.17Примитив в call упаковывается в объект

Задачи из сборки