> В чем отличие контекста в строгом режиме и без него в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: ООО Снэп АйТи
Стек: JavaScript
> Пример ответа
Короткий ответ
В строгом режиме ("use strict") контекст this в обычных функциях равен undefined вместо глобального объекта (window/globalThis). Это предотвращает случайное создание глобальных переменных и делает код безопаснее. В нестрогом режиме this в функциях, вызванных без контекста, ссылается на глобальный объект. Стрелочные функции и методы объектов ведут себя одинаково в обоих режимах.
Подробное объяснение
Основное отличие контекста в строгом режиме (strict mode) от нестрогого (sloppy mode) проявляется в поведении this в обычных функциях (не стрелочных, не методах, не конструкторах). В нестрогом режиме, когда функция вызывается без явного контекста (например, foo()), this привязывается к глобальному объекту - window в браузере или globalThis в Node.js. Это может привести к случайному загрязнению глобальной области видимости, если разработчик забыл объявить переменную через var, let или const.
В строгом режиме this в такой ситуации равен undefined. Это делает ошибки более явными: попытка обратиться к this.someProperty вызовет TypeError, а не создаст неявную глобальную переменную. Strict mode включается директивой "use strict" в начале файла или функции.
Другие аспекты контекста, которые не меняются:
- Методы объектов:
thisуказывает на объект, вызвавший метод, в обоих режимах. - Конструкторы:
thisуказывает на новый экземпляр, если конструктор вызван сnew. Безnewв строгом режимеthisбудетundefined, а в нестрогом - глобальный объект. - Стрелочные функции:
thisлексически привязан к внешнему контексту и не зависит от режима. - Event handlers:
thisобычно указывает на элемент, но в строгом режиме при передаче функции напрямую (не через addEventListener) может бытьundefined.
На практике
На практике строгий режим рекомендуется использовать всегда, особенно в модулях (ES modules и Class-поля автоматически работают в strict mode). Это предотвращает:
- Случайное создание глобальных переменных через
thisв функциях. - Ошибки при вызове конструкторов без
new. - Другие небезопасные поведения, такие как дублирование параметров функций или удаление неудаляемых свойств.
При разработке библиотек или кода, который может быть использован в разных окружениях, стоит явно включать "use strict" в начале каждой функции или файла, чтобы избежать зависимости от глобального режима.
Пример кода
JAVASCRIPT// Нестрогий режим (sloppy mode)function sloppyFunc() {console.log(this); // window (или globalThis)this.globalVar = 'создана глобальная переменная';}sloppyFunc();console.log(window.globalVar); // 'создана глобальная переменная'// Строгий режим (strict mode)function strictFunc() {'use strict';console.log(this); // undefined// this.globalVar2 = 'ошибка'; // TypeError: Cannot set properties of undefined}strictFunc();// Сравнение с методамиconst obj = {method() {console.log(this); // obj в обоих режимах}};obj.method();
Как отвечать на собеседовании
Начните с ключевого отличия: this в обычных функциях равен undefined в strict mode и глобальному объекту в sloppy mode. Затем объясните, почему это важно - предотвращение случайных глобальных переменных и более явные ошибки. Упомяните, что ES modules и классы уже работают в strict mode. Приведите пример, когда различие критично: вызов функции без контекста или конструктора без new. Если спросят про стрелочные функции, отметьте, что они не зависят от режима.
Что проверяет интервьюер
Интервьюер проверяет:
- Понимание механизма привязки
thisв разных режимах. - Знание практических последствий использования strict mode.
- Умение объяснить разницу между контекстом в функциях, методах и конструкторах.
- Осведомленность о современных стандартах (ES modules, классы).
Типичные ошибки
- Утверждение, что strict mode меняет
thisво всех случаях (на самом деле только в обычных функциях). - Путаница между
thisв стрелочных функциях и обычных - стрелочные функции игнорируют режим. - Забывают, что в методах объектов
thisведет себя одинаково в обоих режимах. - Думают, что
"use strict"влияет на глобальный контекст (он не меняетthisна верхнем уровне модуля).
> Похожие задачи по frontend
Какие подводные камни есть при использовании ссылочных типов в JavaScript кроме сравнения
Что происходит с функцией в Map, пока на Map есть ссылка в JavaScript
Как использовать resolve и reject внутри callback для управления состоянием Promise в JavaScript
Какой тип данных должна возвращать функция retry в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью