Есть ли какие-либо проблемы с переназначением аргументов при их передаче функции

#javascript

#javascript

Вопрос:

В следующей throttle функции, timeout в конечном итоге превращается в число, поскольку оно присваивается setTimeout . Я переопределяю его, false поскольку после его очистки код работает.

Я ничего не замечаю на первый взгляд, но интересно, есть ли какие-либо проблемы с выполнением действий таким образом или есть что-то, что я могу упустить?

 const throttle = (fn, delay) => {
  let timeout;

  return (...args) => {

    if(!timeout) { 
      timeout = setTimeout(() => {
        fn(...args);
        clearTimeout(timeout = false);
      }, delay);
    }

  }
};
 

Комментарии:

1. что такое функция дроссельной заслонки?

2. Это безопасно в использовании, но не очень читаемо.

3. По сути, это предотвращает выполнение функции, если не прошло время задержки.

Ответ №1:

Код:

 clearTimeout(timeout = false)
 

вычисляется как:

 timeout = false;
clearTimeout(timeout)
 

это означает, что вы вызываете clearTimeout(false) , и это неверно. clearTimeout() должен вызываться с идентификатором тайм-аута, возвращаемым setTimeout() .

Кажется, это работает, потому что вы вызываете clearTimeout() функцию, которая выполняется по истечении времени ожидания. Вызов clearTimeout() не работает, но время ожидания уже истекло, и JavaScript все равно его очищает.

Вызов clearTimeout() из обратного вызова по таймауту не требуется и не помогает. Цель clearTimeout() состоит в том, чтобы вызвать его до истечения времени ожидания, чтобы предотвратить выполнение обратного вызова, установленного с setTimeout() помощью .

Ваш код должен быть:

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

Комментарии:

1. О, дух, не могу поверить, что я не заметил, что clearTimeout вызывается после истечения тайм-аута.. Да, вы правы, я использовал timeout = false вместо clearTimeout(timeout = false) , и он все еще работает, и код немного чище.