防抖(dbounce)

触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间

  1. /**
  2. * @desc 函数防抖
  3. * @param func 函数
  4. * @param wait 延迟执行毫秒数
  5. * @param immediate true 表立即执行,false 表非立即执行
  6. */
  7. function debounce(func, wait, immediate) {
  8. var timeout, result;
  9. var debounced = function () {
  10. var context = this;
  11. var args = arguments;
  12. if (timeout) clearTimeout(timeout);
  13. if (immediate) {
  14. // 如果已经执行过,不再执行
  15. var callNow = !timeout;
  16. timeout = setTimeout(function(){
  17. timeout = null;
  18. }, wait)
  19. if (callNow) result = func.apply(context, args)
  20. } else {
  21. timeout = setTimeout(function(){
  22. func.apply(context, args)
  23. }, wait);
  24. }
  25. return result;
  26. };
  27. debounced.cancel = function() {
  28. clearTimeout(timeout);
  29. timeout = null;
  30. };
  31. return debounced;
  32. }

节流(throttle)

连续触发事件但是在 n 秒中只执行一次函数,如果在 n 秒内又触发了事件,不会重新计算函数执行时间

  1. /**
  2. * @desc 函数节流
  3. * @param fn 函数
  4. * @param wait 延迟执行毫秒数
  5. * @param options leading: false 禁止第一次执行,trailing: false 禁止最后一次执行
  6. */
  7. function throttle(fn, wait, options) {
  8. var timeout, context, args;
  9. var previous = 0;
  10. if (!options) options = {};
  11. var later = function() {
  12. previous = options.leading === false ? 0 : new Date().getTime();
  13. timeout = null;
  14. fn.apply(context, args);
  15. if (!timeout) context = args = null;
  16. };
  17. var throttled = function() {
  18. var now = new Date().getTime();
  19. if (!previous && options.leading === false) previous = now;
  20. var remaining = wait - (now - previous); // 下次触发fn剩余时间
  21. context = this;
  22. args = arguments;
  23. if (remaining <= 0 || remaining > wait) { // 第一次执行
  24. if (timeout) {
  25. clearTimeout(timeout);
  26. timeout = null;
  27. }
  28. previous = now;
  29. fn.apply(context, args);
  30. if (!timeout) context = args = null;
  31. } else if (!timeout && options.trailing !== false) { // 中间执行与最后一次执行
  32. timeout = setTimeout(later, remaining);
  33. }
  34. };
  35. throttled.cancel = function() {
  36. clearTimeout(timeout);
  37. previous = 0;
  38. timeout = null;
  39. };
  40. return throttled;
  41. }

JavaScript专题之跟着underscore学防抖

JavaScript专题之跟着underscore学节流

JavaScript专题之数组去重

JavaScript专题之类型判断(上)

JavaScript专题之类型判断(下)

JavaScript专题之深浅拷贝

JavaScript专题之从零实现jQuery的extend

JavaScript专题之如何求数组的最大值和最小值

JavaScript专题之数组扁平化

JavaScript专题之学underscore在数组中查找指定元素

JavaScript专题之jQuery通用遍历方法each的实现

JavaScript专题之如何判断两个对象相等

JavaScript专题之函数柯里化

JavaScript专题之偏函数

JavaScript专题之惰性函数

JavaScript专题之函数组合

JavaScript专题之函数记忆

JavaScript专题之递归

JavaScript专题之乱序

JavaScript专题之解读v8排序源码