JavaScript性能优化技巧之函数节流

时间:2022-05-20 13:11:19

函数节流技术的主要思路是,通过一个定时器,阻断连续重复的函数调用。对于我们自己内部使用的函数,这通常意义不大,也不推荐使用这个技术,它可能会丢失对某些数据的处理。但是对于在用户界面调用的函数,却非常有意义。

AD:51CTO网+ 首届中国APP创新评选大赛>>

函数节流技术的主要思路是,通过一个定时器,阻断连续重复的函数调用。对于我们自己内部使用的函数,这通常意义不大,也不推荐使用这个技术,它可能会丢失对某些数据的处理。但是对于在用户界面调用的函数,却非常有意义。例如一个 mousemove 或者 IE 中 resize 事件的监听函数。

JavaScript性能优化技巧之函数节流

这类事件监听函数往往伴随着两个主要特征:1. 短时间内连续多次重复触发 ; 2. 大量的 DOM 操作。众所周知,DOM 操作对内存和 CPU 的开销是比较大的,特别是当同时满足特征1时,往往给浏览器造成不小的压力。函数节流技术的意义在于在用户察觉范围外,降低函数调用的频率,从而提升性能。

这个技巧的大概模式如下面这样:

  1. var processor = {
  2. timeoutId: null,
  3. performProcessing: function(){
  4. // 要执行的代码
  5. },
  6. process: function(){
  7. clearTimeout(this.timeoutId);
  8. this.timeoutId  = setTimeout(function(){
  9. processor.performProcessing();
  10. }, 100);
  11. }
  12. };
  13. //调用
  14. processor.process();
  15. performProcessing 是真正要调用的函数,而程序的入口在 process,每次进入 process,真正要调用的函数
  16. performProcessing 都会被延迟 100 毫秒执行,如果在此期间,process 再次被调用,则会重置前一次的计时器,
  17. 重新开始计时,这样保证了 performProcessing 中的代码至少要间隔 100 毫秒才会被执行一次,原理非常的简单,
  18. 下面这个函数也是利用这个原理,通过闭包达到了同样的目的,它接受两个参数,第一个是要真正要执行的函数,第二个是间隔的时间。
  19. function throttle(fn, delay) {
  20. var timer = null;
  21. return function () {
  22. var context = this, args = arguments;
  23. clearTimeout(timer);
  24. timer = setTimeout(function () {
  25. fn.apply(context, args);
  26. }, delay);
  27. };
  28. }