Почему setTimeout выводит unedfined?

137
17 июля 2021, 19:20

function f(x) { 
 console.log(x) 
} 
 
function delay(f, ms) { 
 
  return function() { 
    setTimeout( () => { 
      f.apply(this, arguments) 
    }, ms ) 
  }; 
 
} 
 
let f1000 = delay(f, 1000); 
f1000('asd')

  1. В переменную f1000 функция delay() вернет анонимную функцию
  2. Функция f1000('asd') вызывает setTimeout в которой первый аргумент стрелочная функция, 2 аргумент время задержки
  3. Разберем первый аргумент (стрелочная функция) setTimeout подробнее
  4. В стрелочной функции происходит вызов f.apply(this, arguments)
  5. функция f первый аргумент this т.к. тут нету объекта то this будет равен глобальному объекту window
  6. функция f второй аргумент arguments будет браться из анонимной функции т.к. в стрелочной функции нету this и arguments
  7. Правильно понял this ?

function f(x) { 
 console.log(x) 
} 
 
function delay(f, ms) { 
 
  return function() { 
    setTimeout( function() { 
      f.apply(this, arguments) 
    }, ms ) 
  }; 
 
} 
 
let f1000 = delay(f, 1000); 
f1000('asd')

Answer 1

Строчка

  f.apply(this, arguments)

находится внутри функции, у которой нет параметров:

setTimeout( function() {
  f.apply(this, arguments)
} )

Вызов

    f.apply(this, arguments)

находится внутри стрелочной функции,

setTimeout(() => f.apply(this, arguments), ms);

у которой arguments указывает на контейнер параметров той функции, которая содержит стрелочную.

READ ALSO
Slider for Bootstrap (ползунок для цен)

Slider for Bootstrap (ползунок для цен)

В интернет-магазине использую библиотеку Slider for Bootstrap, для вывода ползунка выбора диапазона цены

260
Как использовать в конструкторе метод в методе с таймаутом?

Как использовать в конструкторе метод в методе с таймаутом?

Вызываю метод sayMeow() в методе voice() без таймаутаВсе норм

201
js замена слова на всей странице

js замена слова на всей странице

Можно ли как-то улучшить код и написать все более эффективно?

256