> В чем отличие контекста в строгом режиме и без него в 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 на верхнем уровне модуля).

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью