zpět k lekci

Zpožďovací dekorátor

důležitost: 5

Vytvořte dekorátor zpozdi(f, ms), který zpozdí každé volání funkce f o ms milisekund.

Například:

function f(x) {
  alert(x);
}

// vytvoření obalů
let f1000 = zpozdi(f, 1000);
let f1500 = zpozdi(f, 1500);

f1000("test"); // zobrazí "test" za 1000 ms
f1500("test"); // zobrazí "test" za 1500 ms

Jinými slovy, zpozdi(f, ms) vrátí variantu f „zpožděnou o ms“.

V uvedeném kódu je f funkce s jediným argumentem, ale vaše řešení by mělo předávat všechny argumenty a kontextové this.

Otevřít pískoviště s testy.

Řešení:

function zpozdi(f, ms) {

  return function() {
    setTimeout(() => f.apply(this, arguments), ms);
  };

}

let f1000 = zpozdi(alert, 1000);

f1000("test"); // zobrazí "test" za 1000 ms

Prosíme všimněte si, jak je zde použita šipková funkce. Jak víme, šipkové funkce nemají vlastní this ani arguments, takže f.apply(this, arguments) převezme this a arguments z obalu.

Předáme-li běžnou funkci, setTimeout ji bude volat bez argumentů a this=window (za předpokladu, že jsme v prohlížeči).

Můžeme také předávat skutečné this pomocí mezilehlé proměnné, ale to je trochu pracnější:

function zpozdi(f, ms) {

  return function(...argumenty) {
    let uloženéThis = this; // uloží this do mezilehlé proměnné
    setTimeout(function() {
      f.apply(uloženéThis, argumenty); // zde ji použijeme
    }, ms);
  };

}

Otevřít řešení s testy na pískovišti.