Механизмы вызова функций в JS 🖲️

Когда ты вызываешь someFunction(), под капотом срабатывает внутренняя операция [[Call]]. Её задача - определить, что будет this именно для этого вызова. Алгоритм OrdinaryCallBindThis() в этот момент смотрит на контекст: как именно вызвали функцию? Как метод объекта, просто по имени или через new? В зависимости от ответа он вычисляет значение и сразу кладёт его в служебную запись окружения функции.

Вот ключевой момент: эта подготовка, включая расчёт this, происходит до того, как начнёт выполняться тело функции. Когда интерпретатор доходит до строки с this, он не вычисляет его заново. Он просто берёт уже готовое, «приготовленное» значение из служебной записи. Поэтому this - это не свойство функции, которое можно посмотреть в коде, а контекст её конкретного запуска. Пока ты не поставил скобки (), решения о this не существует. Оно рождается только в момент вызова.

Если функция вызвана через new MyConstructor(), то работает уже другая операция - [[Construct]]. Сначала создаётся пустой объект и связывается с прототипом, затем этот объект устанавливается как this, и только потом выполняется тело конструктора для инициализации. Так из функции, которая формально ничего не возвращает, появляется новый экземпляр.

На этот процесс влияет многое: способ вызова (как метод, через new, call/apply), тип функции (стрелочные игнорируют эти правила) и строгий режим. Понимание того, что this определяется в момент вызова, а не объявления 👉 это и есть ключ к управлению контекстом в JavaScript.

Всё это подробно разложено в спецификации ECMAScript, где даже базовые вещи раскрываются как сложные, но логичные цепочки действий. Я часто засиживаюсь за изучением этих моментов в спецификации. В какой-то момент JavaScript открылся для меня с другой стороны. #js #программирование

Механизмы вызова функций в JS 🖲️ | Сетка — социальная сеть от hh.ru