darsga qaytish

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.

Sinovlar bilan sandbox-ni oching.

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

Yechimni sandbox-dagi sinovlar bilan oching.