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

Что выведет console.log(this)?

1.0 Junior🔥 202 комментариев
#JavaScript Core

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Ответ

Это классический вопрос на понимание работы ключевого слова this в JavaScript, и ответ на него зависит исключительно от контекста выполнения, в котором этот console.log(this) вызывается.

Ключевое правило: this в JavaScript определяется тем, как вызывается функция, а не тем, где она объявлена.

Рассмотрим основные сценарии:

1. Глобальный контекст

Если код выполняется на верхнем уровне (не внутри функции или какого-либо объекта), то this ссылается на глобальный объект.

  • В браузере глобальный объект — это window.
  • В Node.js глобальный объект — global (или globalThis в современных версиях).
// В браузере
console.log(this === window); // true
// Выведет объект Window { ... }

2. Контекст обычной функции

Поведение this внутри обычной функции зависит от режима исполнения и способа вызова.

  • В строгом режиме ('use strict'):
    `this` будет равен `undefined`.
```javascript
'use strict';
function myFunc() {
    console.log(this); // Выведет: undefined
}
myFunc();
```
  • В нестрогом режиме:
    `this` ссылается на глобальный объект.
```javascript
function myFunc() {
    console.log(this); // В браузере выведет объект Window
}
myFunc();
```

3. Контекст метода объекта

Если функция вызывается как метод объекта (через точку или квадратные скобки), то this ссылается на объект, которому принадлежит метод.

const person = {
    name: 'Alice',
    greet: function() {
        console.log(this.name); // 'Alice'
        console.log(this); // Выведет объект `person`
    }
};
person.greet(); // Контекст - объект `person`

4. Контекст конструктора (с new)

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

function Car(model) {
    this.model = model;
    console.log(this); // Выведет новый объект, например: Car { model: 'Tesla' }
}
const myCar = new Car('Tesla');

5. Контекст стрелочной функции

Стрелочные функции (=>) не имеют своего собственного this. Они захватывают (наследуют) значение this из окружающей лексической области видимости на момент их создания.

const obj = {
    name: 'Bob',
    regularFunc: function() {
        console.log(this); // Выведет объект `obj`
    },
    arrowFunc: () => {
        console.log(this); // Зависит от внешнего контекста!
    }
};

obj.regularFunc(); // Контекст - `obj`
obj.arrowFunc();   // Может вывести `window` или `undefined` (зависит от места объявления obj)

6. Явное изменение контекста

Мы можем явно привязать this с помощью методов:

  • .call(context, ...args) — вызывает функцию с указанным this и аргументами.
  • .apply(context, [...args]) — аналогично, но аргументы передаются массивом.
  • .bind(context, ...args) — создает новую функцию с навсегда привязанным this.
function showThis() {
    console.log(this.id);
}
const obj1 = { id: 1 };
const obj2 = { id: 2 };

showThis.call(obj1); // Выведет: 1
showThis.apply(obj2); // Выведет: 2
const boundFunc = showThis.bind(obj1);
boundFunc(); // Выведет: 1

Итог

Однозначно ответить, что выведет console.log(this), нельзя без знания контекста. Это может быть:

  • Глобальный объект (window, global, globalThis).
  • undefined (в строгом режиме внутри обычной функции).
  • Объект, которому принадлежит метод.
  • Новый экземпляр объекта, если используется new.
  • Любой другой объект, явно переданный через .call(), .apply() или .bind().
  • Значение this из внешней области видимости, если это стрелочная функция.

Понимание этих правил критически важно для отладки кода и написания корректных обработчиков событий, методов классов и колбэков.

Что выведет console.log(this)? | PrepBro