@tantumus21

Помощь с пониманием устройства debounce?

Разбираю реализацию debounce, попалось 2 варианта:
let count = 0;

const debounce = (fn, delay) => {
  let timer;

  return function (...args) {
    clearTimeout(timer);

    timer = setTimeout(() => {
      fn(...args);
    }, delay);
  };
};


let myFunc = (inc) => {
  console.log(count += inc)
}

myFunc = debounce(myFunc, 600)

window.addEventListener("click", () => myFunc(3));


let counter = 0;

const debounce = (fn, ms) => {
  let timer;

  return function () {
    const fnCall = () => {
      fn.apply(this, arguments);
    };

    clearTimeout(timer);

    timer = setTimeout(fnCall, ms);
  };
};

function myFunc(inc) {
  console.log((counter += inc));
}

myFunc = debounce(myFunc, 600);

window.addEventListener("click", () => myFunc(3));


Первый вопрос заключается в том, как аргументы функции которая оборачивается в debounce, встраиваются вот здесь:
return function (...args) { и здесь fn.apply(this, arguments);. Откуда берется этом массив с аргументами?

Второй вопрос в том, какая из реализаций лучше? Через apply или через вызов оригинальной передаваемой функции?

Спасибо.
  • Вопрос задан
  • 129 просмотров
Решения вопроса 1
@alexalexes
...args
arguments
Это специальные объекты JavaScript. Их заполняет сама среда интерпретарора JS, когда становится активным контекст вызываемой функции. Очень помогает обрабатывать аргументы функции, когда их количество неизвестно заранее, или нужно специально сделать такую функцию, которая обрабатывает произвольное число аргументов.
какая из реализаций лучше?
Если стоит задача написать полифил для поддержки старых версий браузера, то следует использовать объекты JS, которые поддерживаются как можно в ранней версии стандарта языка (смотрите таблицу совместимости браузеров с тем или иным стандартным объектом).
Если такой задачи нет, то берем стильные, модные, молодежные языковые конструкции.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
arguments - это подобный массиву объект, который содержит аргументы, переданные в функцию.

А какая лучше сказать сложно. На первый взгляд разницы практически нет.
Ответ написан
Комментировать
Alexandroppolus
@Alexandroppolus
кодир
Второй вопрос в том, какая из реализаций лучше?
та, которая fn.apply(this, arguments);
потому что там есть поддержка this.
иногда это может понадобиться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы