Zpožďovací dekorátor
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.
Ř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);
};
}