какой смысл объявлять аргументы и контекст в функции debounce - PullRequest
0 голосов
/ 22 января 2020

Я несколько раз сталкивался с настраиваемой функцией debounce, большая часть учебника пишет функцию debounce следующим образом

function debounce(func, wait, immediate) {
var timeout;
return function() {
    var context = this, args = arguments;
    var later = function() {
        timeout = null;
        if (!immediate) func.apply(context, args);
    };
    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
};

};

Я не совсем понимаю значение объявления контекста, аргументов и использования применяется внутри анонимной функции возврата. Какой смысл объявлять эти две переменные, а затем использовать команду apply и передавать эти две функции в функцию tobe в debounce?

Для меня все, что я могу видеть, это то, что это позволяет мне передавать параметры таким образом :

function myFunc(name) {
  console.log('hello',name)
}
debounce(myFunc, 100)('Josh');

Но разве это не то же самое, что просто передать его непосредственно в myFun c и написать так:

debounce(myFunc('Josh'), 100);

Зачем нам нужно применять здесь

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Причина этого в том, что 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, как в в этом примере .

0 голосов
/ 22 января 2020

Вы не можете передать аргументы непосредственно в функцию, которая будет выполнена, потому что эти аргументы могут быть достигнуты только при вызове функции debounce, эти аргументы фактически были неявно переданы функции внутри функции debounce. Здесь

return function ()

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

args = arguments // here they are

И последний вопрос: зачем вам использовать apply?

Это потому, что всякий раз, когда вы имеете дело с каким-то неявным вызовом, как

document.addEventListener('click', myFunc.bind(this)) // Implicit here

Или как в вашем случае

debounce(myFunc, 100)

Вы должен связать необходимый контекст с этим неявным вызовом.

И в вашем случае вы получаете этот контекст только тогда, когда фактически вызываете debounce. В этой реализации контекст, передаваемый внутренней функции, является тем же контекстом, из которого вы вызываете функцию debounce. Если бы вы не использовали apply, контекст внутренней функции был бы ограничен областью действия функции debounce, а не областью, из которой debounce называется

...