Skip to content

Latest commit

 

History

History
34 lines (23 loc) · 952 Bytes

File metadata and controls

34 lines (23 loc) · 952 Bytes

A solução:

function delay(f, ms) {

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

}

let f1000 = delay(alert, 1000);

f1000("test"); // imprima "test" depois 1000ms

Por favor note como uma função em seta (arrow function) é usada aqui. Tal como sabemos, funções em setas não tem seu próprio this e arguments, então f.apply(this, arguments) recebem this e arguments a partir de um encapsulador.

Se passassemos uma função normal, setTimeout a chamaria sem argumentos e this=window (assumindo que estamos no browser).

Ainda podemos passar o this certo atráves do uso de uma variável intermediador, porém é um pouco mais difícil:

function delay(f, ms) {

  return function(...args) {
    let savedThis = this; // guarde isto dentro de uma variável intermediador
    setTimeout(function() {
      f.apply(savedThis, args); // use-o aqui
    }, ms);
  };

}