- 防抖(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;}
