Если синхронность функции не имеет значения (в нашем случае она будет вызывана черз минимальный таймаут), то можно провести следующий трюк. Вместо вызова функции, мы планируем ее вызов в будущем через
setTimeout и запоминаем наши намерения. При последующих вызовах этой функции в пределах одного блока, мы видим, что вызов запланирован, и спокойно ничего не делаем. В общем виде получается нижеследующее:
function planned (func, delay) {
var was_planned,
timer;
was_planned = false;
return function () {
if (!was_planned) {
timer = setTimeout(function () {
func();
was_planned = false;
}, delay || 0);
}
was_planned = true;
return timer;
};
}
И да, чтобы можно было отменить вызов запланированной функции, всегда возвращаем id интервала.
Если использовать 0 интервал, то функцию можно использовать для разовой отправки данных при выходе из блока кода, а с 100мс — перерасчет размеров блоков при ресайзе окна.
function recalculate_box_sizes () {
// stuff to make design fit window size
}
recalculate_box_sizes = planned(recalculate_box_sizes, 300);
window.onresize = recalculate_box_sizes;