Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Function.prototype.limitExecByInterval = function(interval) {
var fn = this, result;
var timer, startTime = 0;
return function() {
if ((new Date() - startTime) >= interval)
{
timer = clearTimeout(timer); // запрещаем повторное выполнение функции после fn.apply(),
// ведь по его завершению ее выполнения может истечь интервал
// и она вызовется снова
result = fn.apply(this, arguments);
startTime = new Date();
} else
if (!timer)
{
var args = arguments;
var scope = this;
timer = setTimeout(function(){
startTime = 0; // делаем возможным выполнение функции fn, при любом раскладе
args.callee.apply(scope, args);
}, interval);
}
return result;
}
}
Function.prototype.limitExecByInterval = function(interval) {
var fn = this;
var timer, expireTime = 0;
return function() {
var elapseTime = expireTime - new Date();
if (elapseTime <= 0)
{
timer = clearTimeout(timer);
fn.apply(this, arguments);
expireTime = Number(new Date()) + interval;
} else
if (!timer)
{
var args = arguments;
var scope = this;
timer = setTimeout(function(){
expireTime = 0;
args.callee.apply(scope, args);
}, elapseTime);
}
}
}
</pre>
ЗЫ Насчет того что код более сложный для понимания - кому как :)
JavaScript: ограничение частоты исполнения функции