0

thisシステムsetTimeout()を介して、現在のオブジェクトと同じユーザー関数を呼び出すメソッドをElement.prototypeに追加しようとしています。私の実装は次のようになります。

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

これを行うためのより効率的またはエレガントな方法はありますか?

(jQueryはご遠慮ください)

4

2 に答える 2

1

ラムダ関数を本当に避けたい場合は、次のようにすることができます。

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 に答える