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);
};
}