套用 setTimeout - JS

Currying with setTimeout - JS

我想为 Function prototype 创建一个自动添加 setTimeout 的方法。我得到了它:

Function.prototype.defer = function (delay) {
  setTimeout(this, delay);
};
    
function f() {
  console.log("Hello!");
}
    
f.defer(1000);

现在我需要像这样通过柯里化将参数传递给我的函数:

function f(a, b) {
  console.log( a + b );
}

f.defer(1000)(4, 2);

我只是通过柯里化实现了它,而不是 setTimeout:

Function.prototype.defer = function (delay) {
  return this
};

function f(a,b) {
  console.log(a + b);
}

f.defer(1000)(4, 2);

但是当我尝试添加 setTimeout 它丢失了它的 this 或者没有将它识别为一个函数。

您需要 return 另一个函数来捕获和传递参数。

Function.prototype.defer = function (delay) {
  return (...args) => setTimeout(this, delay, ...args)
};

function f(a,b) {
  console.log(a + b);
}

f.defer(1000)(4, 2);
console.log('test')

或使用bind

Function.prototype.defer = function (delay) {
  return setTimeout.bind(null, this, delay)
};

function f(a,b) {
  console.log(a + b);
}

f.defer(2000)(4, 2);
console.log('test')

您可以通过修改 .defer() 函数来实现:

    Function.prototype.defer = function (delay, ... args) {
      setTimeout(this.bind(undefined, ... args), delay);
    };
        
    function f(a, b) {
      console.log("a + b is " + (a + b));
    }
    
    f.defer(2000, 4, 5);