作家
登录

JavaScript高级程序设计高级技巧

作者: 来源: 2017-09-05 09:47:02 阅读 我要评论

mousemove事宜在我的电脑的Chrome上1s大年夜概触发60次:

JS高等法度榜样设计高等技能

如不雅你须要监听resize事宜做DOM调剂的话,这个调剂比较费时,1s要调剂40次,如许可能会响应不过来,并且不须要调剂得这么频繁,所以要撙节。

怎么实现一个撙节呢,书里是这么实现的:

  1. function throttle(method, context) { 
  2.     clearTimeout(method.tId); 
  3.     method.tId = setTimeout(function() { 
  4.         method.call(context); 
  5.     }, 100); 

每次履行都要setTimeout一下,如不雅触发得很快就把上一次的setTimeout清掉落从新setTimeout,如许就不会履行很快了。然则如许有个问题,就是这个回调函数可能永远不会履行,因为它一向在触发,一向在清掉落tId,如许就有点难堪,膳绫擎代码的本意应当是100ms内最多触发一次,而实际情况是可能永远不会履行。

  1. function sleep(millionSeconds) { 
  2.     return new Promise(resolve =>  
  3.                              setTimeout(resolve, millionSeconds)); 
  4. sleep(2000).then(() => console.log("sleep recover")); 

把膳绫擎的代码稍微改革一下:

click事宜的履行回调琅绫擎this不是指向了DrawTool的实例了,所以琅绫擎的this.points将会返回undefined。第一种解决办法是应用闭包,先把this缓存一下,变成that:

这个实现就是精确的,每100ms最多履行一次回调,道理是在setTimeout琅绫擎把tId给置成0,如许能让下一次的触发履行。实际实验一下:

JS高等法度榜样设计高等技能

大年夜概每100ms就履行一次,如许就达到我们的目标。

然则如许有一个小问题,就是每次履行都是要延迟100ms,有时刻用户可能就是最大年夜化了窗口,只触发了一次resize事宜,然则此次照样灯揭捉?迟100ms才能履行,假设你的时光是500ms,那就灯揭捉?迟半秒,是以这个实现不太幻想。

须要优化,如下代码所示:

  1. function throttle(method, context) { 
  2.     // 如不雅是第一次触发,急速履行 
  3.     if (typeof method.tId === "undefined") { 
  4.         method.call(context); 
  5.     } 
  6.     if (method.tId) { 
  7.         return
  8.     } 
  9.     method.tId = setTimeout(function() { 
  10.         method.call(context); 
  11.         method.tId = 0; 
  12.     }, 100); 

先断定是否为第一次触发,如不雅是的话急速履行。如许就解决了膳绫擎提到的问题,然则这个实现照样有问题,因为它只是全局的第一次,用户最大年夜化之后,隔了一会又撤消最大年夜化了就又有延迟了,并且第一次触发会执行两次。那怎么办呢?

笔者想到了一个办法:

  1. function throttle(method, context) { 
  2.     if (!method.tId) { 
  3.         method.call(context); 

      推荐阅读

      JS高级程序设计高级技巧

    本篇是看的《JS高等法度榜样设计》第23章《高等技能》做的读书分享。本篇按照书里的思路根据本身的懂得和经验,进行扩大延长,同时指出版里的一些问题。将会评论辩论安然的类型检测、惰性>>>详细阅读


    本文标题:JavaScript高级程序设计高级技巧

    地址:http://www.17bianji.com/lsqh/37134.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)