this - это первый аргумент метода .call() или .apply() в непрямом вызове
В следующем примере показан контекст непрямого вызова:
const world = { name: 'Мир' };
function phrase(string) {
console.log(this === world); // => true
return string + this.name;
}
// Непрямой вызов
phrase.call(world, 'Привет '); // => 'Привет Мир'
phrase.apply(world, ['Пока ']); // => 'Пока Мир'
Непрямой вызов полезен, когда функция должна выполняться с определенным контекстом. Например, для решения проблем контекста с вызовом функции, где this это всегда window или undefined в строгом режиме (см. 2.3). Его можно использовать для имитации вызова метода объекта (см. предыдущий пример).
Другой практический пример - создание иерархии классов в ES5 для вызова родительского конструктора:
function Runner(type) {
console.log(this instanceof Animal); // => true
this.type = type;
}
function Animal(type, legs) {
console.log(this instanceof Animal); // => true
// Непрямой вызов. Вызов родительского конструктора.
Runner.call(this, type);
this.legs = legs;
}
const dog = new Animal('Собака', 4);
dog; // { type: 'Собака', legs: 4 }
Runner.call(this, type) внутри Animal выполняет непрямой вызов родительской функции для инициализации объекта.