0

我正在尝试向 Element.prototype 添加一个方法,该方法将this通过系统 setTimeout() 调用与当前对象相同的用户函数。我的实现如下所示:

Element.prototype.timeout =
    function (func, delay)
    {
        var that = this;
        return setTimeout(function () { func.call(that) }, delay);
    }

有没有更有效或更优雅的方式来做到这一点?

(请不要使用 jQuery)

4

2 回答 2

1

如果您真的想避免使用 lambda 函数,可以执行以下操作:

Function.prototype.delay = function (delay, context) {
  this.self = context;
  this.args = Array.prototype.slice.call(arguments, 2);
  return setTimeout(this, delay);
};

(function () {
  var self = arguments.callee.self || this;
  var args = arguments.callee.args || Array.prototype.slice.call(arguments);
  alert(args[0]);
}).delay(1500, null, 42);

但是这样做很丑陋。

于 2012-08-31T08:46:50.793 回答
0

我能想到的唯一另一件事就是让它成为这样的实用函数,您可以将其与任何对象上的任何函数或方法一起使用:

function delayMethod(obj, method, delay) {
    setTimeout(function() {
        method.call(obj);
    }, delay);
}

或者,使用可变数量的参数更具可扩展性:

function delayMethod(obj, method, delay /* args to method go here */) {
    var args = [].slice.call(arguments, 3);
    setTimeout(function() {
        method.apply(obj, args);
    }, delay);
}
于 2012-08-31T00:35:40.367 回答