Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: this, call, apply, bind, arrow function

Какие существуют способы изменить this?

Вопрос проверяет понимание способов явного управления значением this в JavaScript, что необходимо для корректной работы функций в разных контекстах.

Короткий ответ

Значение this в JavaScript можно изменить несколькими способами. Методы call и apply вызывают функцию с явно заданным контекстом this и аргументами. Метод bind создаёт новую функцию, навсегда привязанную к указанному контексту this. Стрелочные функции не имеют своего this и наследуют его из окружающей лексической области видимости. Также this определяется при вызове функции как метода объекта.

Длинный ответ

В JavaScript значение this динамически определяется в момент вызова функции. Существует несколько способов явно управлять этим значением, что критически важно для работы с методами объектов, обработчиками событий и асинхронным кодом.

Методы call и apply

Методы call и apply позволяют немедленно вызвать функцию, явно указав, на что будет ссылаться this внутри неё. Разница лишь в способе передачи аргументов: call принимает аргументы списком, а apply — массивом.

function greet(greeting) {
  console.log(greeting + ', ' + this.name);
}

const user = { name: 'Alice' };

// Используем call
 greet.call(user, 'Hello'); // Вывод: Hello, Alice

// Используем apply
 greet.apply(user, ['Hi']); // Вывод: Hi, Alice

Метод bind

Метод bind создаёт новую функцию, которая будет иметь жёстко привязанное значение this, независимо от того, как она будет вызвана в дальнейшем. Это полезно для передачи методов в качестве колбэков.

const user = { name: 'Bob' };

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

const boundFunction = showName.bind(user);
boundFunction(); // Вывод: Bob

// Даже при вызове в другом контексте
const anotherObj = { name: 'Eve' };
anotherObj.method = boundFunction;
anotherObj.method(); // Вывод: Bob (все ещё привязан к user)

Стрелочные функции

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

const obj = {
  value: 42,
  regularFunc: function() {
    console.log(this.value); // this ссылается на obj
  },
  arrowFunc: () => {
    console.log(this.value); // this наследуется из внешней области (например, window/undefined)
  }
};

obj.regularFunc(); // 42
obj.arrowFunc(); // undefined (если код выполняется в глобальной области)

Вызов как метода объекта

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

const car = {
  brand: 'Toyota',
  getBrand: function() {
    return this.brand;
  }
};

console.log(car.getBrand()); // Вывод: Toyota

Вывод: Явное управление this через call, apply и bind необходимо, когда контекст вызова функции не соответствует ожидаемому, например, при передаче методов в качестве колбэков или работе с библиотеками. Стрелочные функции следует использовать, когда нужно сохранить лексический контекст, избегая потери this.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#this

#call

#apply

#bind

#arrow function

Подпишись на React Developer в телеграм