数组分块

所谓数组分块,就是当你发现某个循环占用了大量时间,同时对于上述两个问题,你的回答都是“否”,那么你就可以使用定时器分割这个循环。

思路是结合定时器进行递归调用定时器

基本示例如下:

setTimeout(function(){//取出下一个条目并处理var item = array.shift();process(item);//若还有条目,再设置另一个定时器if(array.length > 0){setTimeout(arguments.callee, 100);}
}, 100);

封装成函数如下:

function chunk(array, process, context){setTimeout(function(){var item = array.shift();process.call(context, item);if (array.length > 0){setTimeout(arguments.callee, 100);}}, 100);
}

chunk()方法接受三个参数:要处理的项目的数组,用于处理项目的函数,以及可选的运行该函数的环境。函数内部用了之前描述过的基本模式,通过call()调用的process()函数,这样可以设置一个合适的执行环境(如果必须)。定时器的时间间隔设置为了 100ms,使得 JavaScript进程有时间在处理项目的事件之间转入空闲。你可以根据你的需要更改这个间隔大小,不过100ms在大多数情况下效果不错。可以按如下所示使用该函数:

var data = [12,123,1234,453,436,23,23,5,4123,45,346,5634,2234,345,342];
function printValue(item){var div = document.getElementById("myDiv");div.innerHTML += item + "<br>";
}
chunk(data, printValue);

什么场景用?

数组分块 一般用于什么场景呢?一般用于耗时比较长的循环时,以防脚本长时间运行,导致浏览器崩溃

还有一种方法是吧数组以8为基数,0-8为一组,9-16为一组,以此类推,然后循环,这里里面的8个依次调用,只需要循环外面的大块,也能进行优化

函数节流

什么是函数节流?

某些代码不可以在没有间断的情况连续重复执行。第一次调用函数,创建一个定时器,在指定的时间间隔之后运行代码。当第二次调用该函数时,它会清除前一次的定时器并设置另一个。如果前一个定时器已经执行过了,这个操作就没有任何意义。然而,如果前一个定时器尚未执行,其实就是将其替换为一个新的定时器。目的是只有在执行函数的请求停止了一段时间之后才执行。

函数节流的基本模式如下:

var processor = {timeoutId: null,//实际进行处理的方法performProcessing: function(){//实际执行的代码},//初始处理调用的方法process: function(){clearTimeout(this.timeoutId);var that = this;this.timeoutId = setTimeout(function(){that.performProcessing();}, 100);}
};
//尝试开始执行
processor.process();

简化以后:

function throttle(method, context) {clearTimeout(method.tId);method.tId= setTimeout(function(){method.call(context);}, 100);
}

函数节流的作用是在高频率得调用一个函数时,最终只会在停止触发后调用一次函数,能节省操作成本,和优化性能

自定义事件

事件,什么是事件?

事件是一种叫做观察者的设计模式,这是一种创建松散耦合代码的技术。对象可以发布事件,用来表示在该对象生命周期中某个有趣的时刻到了。然后其他对象可以观察该对象,等待这些有趣的时刻到来并通过运行代码来响应。

观察者模式:

观察者模式由两类对象组成:主体和观察者。主体负责发布事件,同时观察者通过订阅这些事件来观察该主体。该模式的一个关键概念是主体并不知道观察者的任何事情,也就是说它可以独自存在并正常运作即使观察者不存在。从另一方面来说,观察者知道主体并能注册事件的回调函数(事件处理程序)。涉及DOM上时,DOM元素便是主体,你的事件处理代码便是观察者。

事件是与 DOM 交互的最常见的方式,但它们也可以用于非 DOM 代码中——通过实现自定义事件。 自定义事件背后的概念是创建一个管理事件的对象,让其他对象监听那些事件。实现此功能的基本模式 可以如下定义:

function EventTarget(){this.handlers = {};
}
EventTarget.prototype = {constructor: EventTarget,addHandler: function(type, handler){if (typeof this.handlers[type] == "undefined"){this.handlers[type] = [];}this.handlers[type].push(handler);},fire: function(event){if (!event.target){event.target = this;}if (this.handlers[event.type] instanceof Array){var handlers = this.handlers[event.type];for (var i=0, len=handlers.length; i < len; i++){handlers[i](event);}}},removeHandler: function(type, handler){if (this.handlers[type] instanceof Array){var handlers = this.handlers[type];for (var i=0, len=handlers.length; i < len; i++){if (handlers[i] === handler){break;}}handlers.splice(i, 1); }}
};

EventTarget 类型有一个单独的属性handlers,用于储存事件处理程序。还有三个方法:addHandler() ,用于注册给定类型事件的事件处理程序;fire(),用于触发一个事件;removeHandler(),用于注销某个事件类型的事件处理程序。
addHandler()方法接受两个参数:事件类型和用于处理该事件的函数。当调用该方法时,会进行一次检查,看看handlers属性中是否已经存在一个针对该事件类型的数组;如果没有,则创建一个新的。然后使用 push()将该处理程序添加到数组的末尾。
如果要触发一个事件,要调用fire()函数。该方法接受一个单独的参数,是一个至少包含 type属性的对象。fire()方法先给event对象设置一个target属性,如果它尚未被指定的话。然后它就查找对应该事件类型的一组处理程序,调用各个函数,并给出 event 对象。因为这些都是自定义事件,所以event对象上还需要的额外信息由你自己决定。
removeHandler()方法是addHandler()的辅助,它们接受的参数一样:事件的类型和事件处理程序。这个方法搜索事件处理程序的数组找到要删除的处理程序的位置。如果找到了,则使用 break操作符退出for循环。然后使用splice()方法将该项目从数组中删除。

使用 EventTarget 类型的自定义事件可以如下使用:

function handleMessage(event){alert("Message received: " + event.message);
}
//创建一个新对象
var target = new EventTarget();
//添加一个事件处理程序
target.addHandler("message", handleMessage);
//触发事件
target.fire({ type: "message", message: "Hello world!"});
//删除事件处理程序
target.removeHandler("message", handleMessage);
//再次,应没有处理程序
target.fire({ type: "message", message: "Hello world!"});

setitimer 创建两个定时器_JavaScript第二十四篇 高级定时器(下)相关推荐

  1. JavaScript第二十四篇 高级定时器(下)

    数组分块 所谓数组分块,就是当你发现某个循环占用了大量时间,同时对于上述两个问题,你的回答都是"否",那么你就可以使用定时器分割这个循环. 思路是结合定时器进行递归调用定时器 基本 ...

  2. 【正点原子MP157连载】第二十四章 设备树下的LED驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  3. 第二十四篇:可靠信号机制

    前言 曾经的 UNIX 系统中,信号的不可靠的.什么是不可靠?就是信号丢失呗.那什么是信号丢失?就是当系统正在处理某个事务的时候,如果收到了某个信号,但它不能及时处理这个信号,那么只能忽略掉此信号. ...

  4. Python之路【第二十四篇】Python算法排序一

    什么是算法 1.什么是算法 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出.简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果. ...

  5. slim php dd model,第二十四节,TensorFlow下slim库函数的使用以及使用VGG网络进行预训练、迁移学习(附代码)...

    在介绍这一节之前,需要你对slim模型库有一些基本了解,具体可以参考第二十二节,TensorFlow中的图片分类模型库slim的使用.数据集处理,这一节我们会详细介绍slim模型库下面的一些函数的使用 ...

  6. Scala入门到精通——第二十四节 高级类型 (三)

    本节主要内容 Type Specialization Manifest.TypeTag.ClassTag Scala类型系统总结 在Scala中,类(class)与类型(type)是两个不一样的概念. ...

  7. 【Java成王之路】EE初阶第二十四篇: Servlet

    Sevlet Servlet 是什么 Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一 个 web app. Tomcat 是一个 ...

  8. SpringBoot第二十四篇: springboot整合docker

    这篇文篇介绍,怎么为 springboot程序构建一个docker镜像.docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的 ...

  9. “约见”面试官系列之常见面试题第二十四篇之vue-router使用(建议收藏)

    开发的时候有时候会遇到一种情况,比如 :点击这个链接跳转到其他组件的情况,通常会跳转到新的页面,蛋是,我们不想跳转到新页面,只在当前页面切换着显示,那么就要涉及到路由的嵌套了,也可以说是子路由的使用. ...

最新文章

  1. 【 FPGA 】7 Series FPGA中对MUX的设计指导
  2. 返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)
  3. xen虚拟化实战系列(六)之xen虚拟机破解密码
  4. 解决mysqlAccess denied for user'root'@'IP地址'问题
  5. 自主招生计算机专业自我介绍,自主招生自我介绍参考范文
  6. 【linux】查看字体
  7. ORACLE搭建Stream过程中报错【error收集】
  8. php七牛分片上传_利用七牛的php SDK分片上传时如何处理Notify?
  9. c# MEF框架(二 MEF的导出(Export)和导入(Import))
  10. [erlang]erlang程序运行的几种方式
  11. python-day19-面向对象进阶-加载顺序,命名空间,组合(实现松耦合)
  12. python爬虫教程-Python教父|廖雪峰老师官方爬虫教程,13个案例带你全面入门!
  13. VMware Perl SDK error “Server Version Unavailable .. line 545”
  14. 海康摄像机取流RTSP地址规则说明
  15. 克隆虚拟机后开机出现device eth0 does not seem to be present delaying initializa错误
  16. 免费 在线转换 音频,图像,PDF,视频,文档等格式转换
  17. 叉积 微分 恒等式_一个斜三角中的恒等式
  18. C语言:一个非常完美MAX宏的诞生及5次进化
  19. Android实现涂鸦功能
  20. pandas取整 pandas取整数 pandas 转成int

热门文章

  1. android换肤动画,Android-换肤ThemeSkinning使用
  2. 蜗蜗 Linux内核芬妮下,Linux内核的整体架构
  3. [k8s] 第三章 k8s 资源管理
  4. Method Swizzling的各种姿势
  5. Linux配置vsftpd 服务
  6. c++读取文本文件里的指定位置的字符_利用FSO对象向文本文件中写入信息
  7. php文件什么打开,php文件是什么文件_php文件怎么打开 - 学无忧
  8. 窗体 局部变量转换为全局_Unity 热更新解决方案 学习笔记(12)Lua 全局变量和局部变量...
  9. iis5.1配置php5.3.1详解,WinXP IIS 5.1 PHP 5.3 VC9.0 配置详解
  10. c语言温度查表程序,温度计C语言程序.doc