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

Какие методы меняют this в JavaScript?

2.0 Middle🔥 281 комментариев
#JavaScript Core#Браузер и сетевые технологии

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

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

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

Методы, влияющие на значение this в JavaScript

В JavaScript значение ключевого слова this является одним из самых запутанных аспектов языка, поскольку оно определяется контекстом выполнения, а не местом объявления. Существует несколько встроенных методов, которые позволяют явно управлять значением this при вызове функций. Их можно разделить на две основные группы: методы функций (Function Methods) и метод объектов (связанный с классами).

1. Методы функций (Function.prototype)

Эти методы доступны для любой функции и позволяют явно задать контекст this при её вызове.

call()

Метод call() вызывает функцию с заданным значением this и отдельными аргументами (через запятую).

function greet(greeting, punctuation) {
  console.log(`${greeting}, ${this.name}${punctuation}`);
}

const person = { name: 'Анна' };
greet.call(person, 'Привет', '!'); // Вывод: Привет, Анна!
  • Первый аргумент — значение this.
  • Остальные аргументы передаются функции как есть.

apply()

Метод apply() аналогичен call(), но принимает аргументы для функции в виде массива (или array-like объекта).

function introduce(age, city) {
  console.log(`Меня зовут ${this.name}, мне ${age} лет, я из ${city}.`);
}

const user = { name: 'Иван' };
const args = [30, 'Москвы'];
introduce.apply(user, args); // Вывод: Меня зовут Иван, мне 30 лет, я из Москвы.
  • Удобен, когда аргументы динамически формируются в массиве.

bind()

Метод bind() создаёт новую функцию, которая при вызове имеет заданное значение this. В отличие от call() и apply(), bind() не вызывает функцию сразу, а возвращает "привязанную" функцию.

function showInfo() {
  console.log(`Имя: ${this.name}, Возраст: ${this.age}`);
}

const data = { name: 'Мария', age: 25 };
const boundFunction = showInfo.bind(data);
boundFunction(); // Вывод: Имя: Мария, Возраст: 25
  • bind() также позволяет выполнять частичное применение (partial application), фиксируя некоторые аргументы.
function multiply(a, b) {
  return a * b;
}
const double = multiply.bind(null, 2);
console.log(double(5)); // 10 (2 * 5)

2. Метод в контексте классов (конструктора)

new

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

function Person(name) {
  // this = {} (неявно создаётся новый объект)
  this.name = name;
  this.greet = function() {
    console.log(`Привет, я ${this.name}`);
  };
  // return this; (неявно возвращается)
}

const john = new Person('Джон');
john.greet(); // Вывод: Привет, я Джон
  • Если функция вызывается с new, приоритет этого механизма выше, чем у явного задания this через call, apply или bind (хотя комбинации возможны, но требуют осторожности).

3. Стрелочные функции — важное исключение

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

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

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

Сравнение методов

МетодИзменяет this?Вызывает функцию сразу?АргументыВозвращает
call()ДаДаСписок (через запятую)Результат вызова функции
apply()ДаДаМассив (или array-like)Результат вызова функции
bind()ДаНетСписок (частичное применение)Новая функция с привязанным this
newДа (на новый объект)ДаСписокНовый объект (экземпляр)

Практические рекомендации

  1. Выбор метода:

    • Используйте call() или apply(), когда нужно немедленно вызвать функцию с определённым контекстом.
    • Используйте bind(), когда контекст должен быть зафиксирован для будущих вызовов (например, в обработчиках событий или колбэках).
    • Оператор new предназначен для создания экземпляров объектов из функций-конструкторов или классов.
  2. Современный JavaScript (ES6+):

    • В классах и методах объектов, определённых через сокращённый синтаксис, значение this ведёт себя как в обычных функциях, но для избежания потери контекста часто используют стрелочные функции или привязку через bind() в конструкторе.
    • Стрелочные функции идеальны, когда нужно сохранить лексический this (например, в цепочках промисов или в методах класса, где требуется доступ к экземпляру).
class Timer {
  constructor() {
    this.seconds = 0;
    // Используем стрелочную функцию, чтобы сохранить this
    this.increment = () => {
      this.seconds++;
      console.log(this.seconds);
    };
  }
}

const timer = new Timer();
setInterval(timer.increment, 1000); // Корректно работает, this привязан к экземпляру

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

Какие методы меняют this в JavaScript? | PrepBro