- 防抖(dbounce)
- 节流(throttle)
- JavaScript专题之跟着underscore学防抖">JavaScript专题之跟着underscore学防抖
- JavaScript专题之跟着underscore学节流">JavaScript专题之跟着underscore学节流
- JavaScript专题之数组去重">JavaScript专题之数组去重
- JavaScript专题之类型判断(上)">JavaScript专题之类型判断(上)
- JavaScript专题之类型判断(下)">JavaScript专题之类型判断(下)
- JavaScript专题之深浅拷贝">JavaScript专题之深浅拷贝
- JavaScript专题之从零实现jQuery的extend">JavaScript专题之从零实现jQuery的extend
- JavaScript专题之如何求数组的最大值和最小值">JavaScript专题之如何求数组的最大值和最小值
- JavaScript专题之数组扁平化">JavaScript专题之数组扁平化
- JavaScript专题之学underscore在数组中查找指定元素">JavaScript专题之学underscore在数组中查找指定元素
- JavaScript专题之jQuery通用遍历方法each的实现">JavaScript专题之jQuery通用遍历方法each的实现
- JavaScript专题之如何判断两个对象相等">JavaScript专题之如何判断两个对象相等
- JavaScript专题之函数柯里化">JavaScript专题之函数柯里化
- JavaScript专题之偏函数">JavaScript专题之偏函数
- JavaScript专题之惰性函数">JavaScript专题之惰性函数
- JavaScript专题之函数组合">JavaScript专题之函数组合
- JavaScript专题之函数记忆">JavaScript专题之函数记忆
- JavaScript专题之递归">JavaScript专题之递归
- JavaScript专题之乱序">JavaScript专题之乱序
- JavaScript专题之解读v8排序源码">JavaScript专题之解读v8排序源码
防抖(dbounce)
触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间
/**
* @desc 函数防抖
* @param func 函数
* @param wait 延迟执行毫秒数
* @param immediate true 表立即执行,false 表非立即执行
*/
function debounce(func, wait, immediate) {
var timeout, result;
var debounced = function () {
var context = this;
var args = arguments;
if (timeout) clearTimeout(timeout);
if (immediate) {
// 如果已经执行过,不再执行
var callNow = !timeout;
timeout = setTimeout(function(){
timeout = null;
}, wait)
if (callNow) result = func.apply(context, args)
} else {
timeout = setTimeout(function(){
func.apply(context, args)
}, wait);
}
return result;
};
debounced.cancel = function() {
clearTimeout(timeout);
timeout = null;
};
return debounced;
}
节流(throttle)
连续触发事件但是在 n 秒中只执行一次函数,如果在 n 秒内又触发了事件,不会重新计算函数执行时间
/**
* @desc 函数节流
* @param fn 函数
* @param wait 延迟执行毫秒数
* @param options leading: false 禁止第一次执行,trailing: false 禁止最后一次执行
*/
function throttle(fn, wait, options) {
var timeout, context, args;
var previous = 0;
if (!options) options = {};
var later = function() {
previous = options.leading === false ? 0 : new Date().getTime();
timeout = null;
fn.apply(context, args);
if (!timeout) context = args = null;
};
var throttled = function() {
var now = new Date().getTime();
if (!previous && options.leading === false) previous = now;
var remaining = wait - (now - previous); // 下次触发fn剩余时间
context = this;
args = arguments;
if (remaining <= 0 || remaining > wait) { // 第一次执行
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
previous = now;
fn.apply(context, args);
if (!timeout) context = args = null;
} else if (!timeout && options.trailing !== false) { // 中间执行与最后一次执行
timeout = setTimeout(later, remaining);
}
};
throttled.cancel = function() {
clearTimeout(timeout);
previous = 0;
timeout = null;
};
return throttled;
}