← Назад к вопросам

Вызывается ли вместо глобального контекста undefined в use strict

2.0 Middle🔥 191 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Вызывается ли вместо глобального контекста undefined в use strict

Да, это один из ключевых эффектов strict mode в JavaScript. Когда вы переводите код в режим "use strict", поведение this кардинально меняется в функциях, вызванных без явного контекста.

Поведение в обычном режиме (non-strict)

В обычном режиме, если функция вызывается без явного объекта-контекста, this автоматически указывает на глобальный объект (в браузере — window, в Node.js — global):

function greet() {
  console.log(this);
}

greet(); // window (в браузере)

Это происходит потому, что JavaScript применяет автоматическую привязку к глобальному контексту, если не указано иное.

Поведение в strict mode

В режиме use strict функция, вызванная без явного контекста, получит this === undefined вместо глобального объекта:

"use strict";

function greet() {
  console.log(this); // undefined
}

greet(); // undefined

Это происходит потому, что strict mode запрещает автоматическую привязку к глобальному объекту. Функция будет иметь this = undefined, что часто приводит к ошибкам, если функция внутри обращается к this.someProperty.

Практический пример с ошибкой

"use strict";

const person = {
  name: "Иван",
  greet: function() {
    console.log(this.name);
  }
};

person.greet(); // "Иван" — работает, т.к. вызов через объект

const greetFunc = person.greet;
greetFunc(); // TypeError: Cannot read property name of undefined

Во втором случае функция вызывается без контекста, поэтому this становится undefined, и обращение к this.name вызывает ошибку.

Как это избежать

1. Явная привязка контекста с помощью .call(), .apply() или .bind():

"use strict";

function greet() {
  console.log(this.name);
}

const person = { name: "Мария" };
greet.call(person); // "Мария"
greet.apply(person); // "Мария"

const boundGreet = greet.bind(person);
boundGreet(); // "Мария"

2. Использование стрелочных функций (lexical this):

"use strict";

const person = {
  name: "Петр",
  greet: () => {
    console.log(this); // наследует this из внешнего scope (в данном случае, глобальный или undefined)
  }
};

person.greet();

Стрелочные функции не имеют собственного this — они наследуют его из внешней области видимости.

3. Использование классов:

"use strict";

class Person {
  constructor(name) {
    this.name = name;
  }

  greet() {
    console.log(this.name);
  }
}

const person = new Person("Анна");
person.greet(); // "Анна" — контекст всегда правильный

Почему это важно?

Strict mode делает код более предсказуемым и безопасным:

  • Предотвращает скрытые ошибки — случайная привязка к глобальному объекту может привести к неожиданному поведению
  • Облегчает отладку — вместо молчаливой привязки к window, вы получаете явную ошибку
  • Поощряет лучшие практики — заставляет явно управлять контекстом

В современном JavaScript, особенно при использовании модулей (ES6 modules автоматически в strict mode), это поведение становится стандартным и ожидаемым.