Derse geri dön

Geciktirici dekoratör.

önem: 5

delay(f,ms) adında bir dekoratör yazın ve bu dekoratör her f in çağırılmasında ms milisaniye kadar geciktirilsin.

Örneğin:

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

// Saklayıcı
let f1000 = delay(f, 1000);
let f1500 = delay(f, 1500);

f1000("test"); // "test" yazısı 1000ms sonra gelir.
f1500("test"); // "test" yazısı 1500ms sonra gelir.

Diğer bir deyişle delay(f, ms) f fonksiyonunun ms kadar geciktirilmiş versiyonunu döner.

Yukarıdaki kodda, f tek argümanlı bir fonksiyondur. Fakat sizin çözümünüzde bu tüm argümanların ve kaynağın this şeklinde fonksiyona iletilmesi gerekmektedir.

Testler ile korunaklı olan aç.

Çözüm:

function delay(f, ms) {

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

}

Yukarıda ok fonksiyonunun nasıl kullanıldığına dikkat edin. Bildiğiniz gibi, ok fonksiyonlarında this ve arguments bulunmaz, bunun için f.apply(this, arguments) , this ve arguments'ı saklayıcıdan(wrapper) alır.

Eğer sıradan bir fonksiyon paslarsanız, setTimeout bunu argümansız this=window ( tarayıcıda ) olacak şekilde çağırır, bundan dolayı saklayıcıdan bu değerleri iletebilmek için biraz daha kod yazmalıyız:

function delay(f, ms) {

  // `this` ve diğer argümanların setTimeout içerisindeki saklayıcıdan iletilmesini sağlar.
  return function(...args) {
    let savedThis = this;
    setTimeout(function() {
      f.apply(savedThis, args);
    }, ms);
  };

}
function delay(f, ms) {

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

};

Çözümü testler korunaklı alanda olacak şekilde aç.