Dekorativni kechiktirish
f ning har bir chaqiruvini ms millisoniyalarga kechiktiradigan dekorativ delay(f, ms) yarating.
Masalan:
function f(x) {
alert(x);
}
// o'rama yarating
let f1000 = delay(f, 1000);
let f1500 = delay(f, 1500);
f1000("test"); // 1000ms dan keyin "test" ni ko'rsatadi
f1500("test"); // 1500ms dan keyin "test" ni ko'rsatadi
Boshqacha qilib aytganda, delay(f, ms) f ning ms bilan kechiktirilganligini qaytaradi.
Yuqoridagi kodda f bitta argumentning funktsiyasidir, ammo sizning yechimingiz barcha argumentlarni va kontekstni this dan oâtkazishi kerak.
Yechim:
function delay(f, ms) {
return function () {
setTimeout(() => f.apply(this, arguments), ms);
};
}
let f1000 = delay(alert, 1000);
f1000("test"); // 1000ms dan keyin "test" ni ko'rsatadi
Iltimos, bu yerda oâq funktsiyasidan qanday foydalanilganiga eâtibor bering. Maâlumki, oâq funktsiyalari oâzlarining this va argumentlari ga ega emas, shuning uchun f.apply(this, arguments) this va argumentlarni oâramdan oladi.
Agar biz odatdagi funktsiyani oâtkazsak, setTimeout uni argumentlarsiz chaqiradi va this=window (biz brauzerda ekanligimizni taxmin qilamiz).
Biz hali ham this dan oraliq oâzgaruvchanni ishlatib oâtishimiz mumkin, ammo bu biroz noqulayroq:
function delay(f, ms) {
return function (...args) {
let savedThis = this; // buni oraliq o'zgaruvchanga saqlang
setTimeout(function () {
f.apply(savedThis, args); // bu yerda ishlating
}, ms);
};
}