Для чего вызывают apply и call последовательно?

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

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

Если вам нужно последовательно передать как контекст, так и аргументы функции, то сначала вы можете использовать call() для установки контекста, а затем apply() для передачи аргументов.

Например, предположим, у вас есть функция calculate, которая принимает два аргумента и выполняет операцию над ними. Для вызова этой функции с определенным контекстом и аргументами, вы можете сделать следующее:

function calculate(a, b) {
  return this.value + a + b;
}

let context = { value: 10 };

// Вызываем функцию calculate с контекстом context и аргументами 5, 7
let result = calculate.call(context, 5, 7);

// Результат будет равен 22, так как value из контекста равно 10, а аргументы 5 и 7 переданы в функцию
console.log(result);

// Теперь предположим, что у нас есть массив с аргументами, которые мы хотим передать
let args = [3, 9];

// Вызываем функцию calculate с контекстом context и аргументами из массива args
let result2 = calculate.apply(context, args);

// Результат будет равен 22, так как value из контекста равно 10, а аргументы 3 и 9 из массива переданы в функцию
console.log(result2);

Таким образом, использование apply() и call() вместе позволяет динамически устанавливать как контекст выполнения функции, так и передавать аргументы в функцию, что делает их мощными инструментами при работе с функциями в JavaScript.