JSFiddle - React, Tailwind, and code Playground

by artgas_pro

JavaScript

//defer(f, ms) принимает функцию и возвращает обёртку над ней, которая откладывает вызов на ms миллисекунд:
function defer(f, ms) {
  return function() {
    setTimeout(() => f.apply(this, arguments), ms)
  };
}

function sayHi(who) {
  alert('Hello, ' + who);
}

let sayHiDeferred = defer(sayHi, 2000);
sayHiDeferred("John"); // выводит "Hello, John" через 2 секунды

//То же самое без стрелочной функции выглядело бы так:
function defer(f, ms) {
  return function(...args) {
    let ctx = this;
    setTimeout(function() {
      return f.apply(ctx, args);
    }, ms);
  };
}
//десь мы были вынуждены создать дополнительные переменные args и ctx, чтобы функция внутри setTimeout могла получить их.

/*
Шо я не можу зрозуміти
1) 4 рядок - навіщо нам переопредиляти контекст визову? чому просто не можна зробити  setTimeout(() => f(), ms)
2) 18 рядок - коли ми зберігаємо this у ctx що ми зберігаємо?
*/