这是我对requestAnimationFrame
的理解验证。因为我需要一个防抖函数,每次窗口大小改变都会进行一些DOM交互,我不想让浏览器负担过重。典型的防抖函数每个时间间隔只会调用传递的函数一次,时间间隔通常是第二个参数。我假设对于大多数UI工作,最佳间隔时间是不会使浏览器超载的最短时间。在我看来,这正是requestAnimationFrame
所能实现的:
var debounce = function (func, execAsap) {
var timeout;
return function debounced () {
var obj = this, args = arguments;
function delayed () {
if (!execAsap)
func.apply(obj, args);
timeout = null;
};
if (timeout)
cancelAnimationFrame(timeout);
else if (execAsap)
func.apply(obj, args);
timeout = requestAnimationFrame(delayed);
};
}
上面的代码直接复制自上面的
debounce
链接,但使用了请求动画帧代替setTimeout。据我理解,这将尽快地将传入的函数排队,但浏览器无法处理的任何调用都会被丢弃。这应该产生最平滑的交互效果。我是在正确的轨道上吗?还是我误解了requestAnimationFrame
?(当然,这仅适用于现代浏览器,但有一些简单的requestAnimationFrame Polyfill可回退到setTimeout。)
var obj = this
。这样人们在调用之前就不必使用bind
,并且可以节省创建另一个函数作用域的时间。 - Dogoku