我正在尝试通过系统setTimeout()向Element.prototype添加一个方法,该方法将使用与当前对象相同的this
来调用用户函数。我的实现如下:
Element.prototype.timeout =
function (func, delay)
{
var that = this;
return setTimeout(function () { func.call(that) }, delay);
}
有更高效或更优雅的方式吗?
(请不要jQuery)
答案 0 :(得分:2)
如果您真的想避免使用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);
但这样做很难看。
答案 1 :(得分: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);
}