题目解读

解析防抖与节流,列举场景,代码,没有es6的情况

场景

  • 防抖:在搜索输入框中,根据用户输入内容变化动态展示联想搜索词
  • 节流:抢票啊、提交数据、切换、轮播和部分Animate动画中,执行完上一次操作后才能再次点击执行对应的函数

防抖

连续调用一个fn时,只有最后一次的调用会被执行

  1. function debounce(fn, delay = 500, immediate = false) {
  2. let timer;
  3. return function (...args) {
  4. if (immediate) {
  5. if (timer) {
  6. clearTimeout(timer);
  7. } else {
  8. fn.apply(this, ...args)
  9. }
  10. timer = setTimeout(() => {
  11. timer = null;
  12. }, delay);
  13. } else {
  14. if (timer) {
  15. clearTimeout(timer);
  16. }
  17. timer = setTimeout(() => {
  18. fn.apply(this, ...args)
  19. }, delay);
  20. }
  21. }
  22. }
  23. function debounce(fn, delay = 500, immediate = false) {
  24. let timer;
  25. return function (...args) {
  26. if (timer) {
  27. clearTimeout(timer);
  28. }
  29. if (immediate && !timer) {
  30. fn.apply(this, ...args)
  31. }
  32. timer = setTimeout(() => {
  33. timer = null;
  34. !immediate && fn.apply(this, ...args)
  35. }, delay);
  36. }
  37. }
  38. function debounce(fn, delay = 500, immediate = false) {
  39. let timer,
  40. later = function (args) {
  41. return setTimeout(() => {
  42. timer = null;
  43. !immediate && fn.apply(this, args);
  44. }, delay)
  45. }
  46. return function (...args) {
  47. if (timer) {
  48. clearTimeout(timer);
  49. timer = later(args);
  50. } else {
  51. timer = later();
  52. immediate && fn.apply(this, args);
  53. }
  54. }
  55. }
  56. // 没有es6怎么办
  57. function debounce(fn, delay = 500, immediate = false) {
  58. let timer, context, args,
  59. later = function () {
  60. return setTimeout(function () {
  61. timer = null;
  62. !immediate && fn.apply(context, args);
  63. context = args = null;
  64. }, delay)
  65. }
  66. return function () {
  67. context = this;
  68. args = arguments;
  69. if (timer) {
  70. clearTimeout(timer);
  71. timer = later();
  72. } else {
  73. timer = later();
  74. immediate && fn.apply(this, args);
  75. }
  76. }
  77. }

节流

连续调用一个fn时,每隔一段时间调用一次

  1. // 头触发
  2. function throttle(fn, delay) {
  3. let timer;
  4. return function (...args) {
  5. if (timer) {
  6. return;
  7. }
  8. fn.apply(this, args);
  9. timer = setTimeout(() => {
  10. timer = null;
  11. }, delay);
  12. }
  13. }
  14. // 尾触发
  15. function throttle(fn, delay) {
  16. let timer;
  17. return function (...args) {
  18. if (timer) {
  19. return;
  20. }
  21. timer = setTimeout(() => {
  22. fn.apply(this, args);
  23. timer = null;
  24. }, delay);
  25. }
  26. }
  27. // 头尾触发
  28. function throttle(fn, delay) {
  29. let timer;
  30. return function (...args) {
  31. if (timer) {
  32. return;
  33. }
  34. fn.apply(this, args);
  35. timer = setTimeout(() => {
  36. fn.apply(this, args);
  37. timer = null;
  38. }, delay);
  39. }
  40. }
  41. // 没有es6
  42. function throttle(fn, delay) {
  43. let timer, context, args;
  44. return function (...args) {
  45. context = this;
  46. args = arguments;
  47. if (timer) {
  48. return;
  49. }
  50. fn.apply(this, args);
  51. timer = setTimeout(function() {
  52. fn.apply(context, args);
  53. timer = null;
  54. context = args = null;
  55. }, delay);
  56. }
  57. }