Причина этого в том, что debounce должен вызывать определенную функцию по истечении заданного промежутка времени. Для вызова функции требуется ссылка на функцию. Если бы вы делали что-то вроде:
debounce(myFunc('Josh'), 100);
myFunc('Josh')
на самом деле не является ссылкой на функцию myFunc
, а скорее является оценкой функции myFunc
. Это может быть полезно для пояснения этого вопроса на примере.
// this is a function definition
function add(num1, num2) {
return num1 + num2;
}
console.log(add); // `add` is a function reference
console.log(add(1, 1)); // 2 is the result of the function's evaluation
Учитывая приведенный выше пример, если вы сделали debounce(add(1, 2), 100);
, вы бы попросили функцию debounce вызвать значение 2
после 100 мс бездействия. Что вы действительно хотите сделать, так это вызвать функцию add
, но для этого вам нужно передать ссылку на функцию: debounce(add, 100)
. Теперь проблема в том, что мы не можем передать параметры в функцию add, и именно здесь карринг пригодится.
Объявление анонимной функции - это способ управления областью действия и контекстом вызываемого метода. , Он создает замыкание, в котором все его переменные и состояние будут продолжать существовать до тех пор, пока не будет выполнена функция. Например, если вы применяете функцию debounce к полю ввода, аргументы могут отличаться каждый раз, когда пользователь запускает функцию debounce. Сохранение args
внутри замыкания позволяет каждой новой функции «запоминать» свои собственные аргументы.
Относительно того, почему вы хотите использовать .apply
, это просто потому, что аргументы - это массив значений, так что если вы хотите вызывать ваш метод с несколькими отдельными аргументами, вам нужно использовать .apply
, как в в этом примере .