JavaScript事件驱动机制&定时器机制
在浏览器中,事件作为一个极为重要的机制,给予JavaScript响应用户操作与DOM变化的能力。在NodeJS中。异步事件驱动模型则是提高并发能力的基础。
一、程序怎样响应事件
程序响应外部的事件有两种方式:1. 中断
操作系统处理键盘等硬件输入就是通过中断来进行的。这个方式的优点是即使没有多线程,我们也能够放心地运行我们的代码,CPU收到中断信号之后自己主动地转去运行对应的中断处理程序,处理完毕后会恢复原来的代码的运行环境继续运行。
这样的方式须要硬件的支持。一般来说都会被操作系统封装起来。
2. 轮询
循环检測是否有事件发生,假设有就去运行对应的处理程序。这在底层和上层的开发中都有应用。轮询方式的一个缺点就是:假设在主线程的消息循环里进行耗时操作。程序就无法及时响应新的消息。
二、JavaScript中定时器功能的特点
不管是Node还是浏览器中,都有setTimeout和setInterval这两个定时器函数。而且其工作特点基本同样。
JavaScript中的定时器并不同于计算机底层的定时中断。
中断到来时,当前运行代码会被打断。转去运行定时中断处理函数。
而JavaScript的定时器到时,假设当前运行线程没有正在运行的代码。则运行对应的回调函数;假设当前有代码在运行中,JavaScript引擎既不会中断当前代码转去运行回调,也不会开新的线程运行回调,而是当前代码运行完成之后才去处理。
console.time("setTimoutLabel"); //标记时间開始 setTimeout(function() { console.timeEnd("setTimoutLabel"); //标记时间结束 }, 100); for (var i = 0; i < 100000; i++) { }
运行上面的代码。能够看到终于输出的时间并非100ms左右,而是数秒。
这说明在循环完毕之前,定时回调函数确实没有被运行。而是推迟到了循环结束。实际上在JavaScript代码运行中,所有的事件都无法得到处理,必须等到当前代码所有完毕,才干去处理新的事件。这就是为什么在浏览器中运行耗时JavaScript代码时,浏览器会失去响应。
三、定时器的工作原理
1. javascript引擎仅仅有一个线程,迫使异步事件仅仅能增加队列去等待运行。
2. 在运行异步代码的时候,假设定时器被正在运行的代码堵塞了,它将会进入队列的尾部去等待运行直到下一次可能运行的时间出现(可能超过设定的延时时间)。setTimeout 和setInterval 是有着本质差别的:setTimeout 这段代码会在每次回调函数运行之后至少须要延时“指定延迟毫秒值”再去执行(可能是很多其它,可是不会少)。可是setInterval会每隔“指定延迟毫秒值”就去尝试运行一次回调函数。无论上一个回调函数是不是还在运行。
- JavaScript事件驱动机制&定时器机制
- JavaScript的定时器使用和事件驱动
- 韩顺平 javascript教学视频_学习笔记23_js事件驱动机制深入理解_js常用事件_js版计算器
- 韩顺平 javascript教学视频_学习笔记22_js事件驱动机制_js事件分类_js访问css技术
- C# 事件驱动机制
- javascript事件驱动模型的不完全剖析
- 【Todo】React & Nodejs学习 &事件驱动,非阻塞IO & JS知识栈:Node为主,JQuery为辅,Bootstrap & React为辅辅,其他如Angular了解用途即可
- Windows 消息处理机制与事件驱动
- Flash AS3 学习12 - 事件处理机制
- JavaScript 事件模型 事件处理机制
- javascript事件机制学习(一)——个人实现
- javascript_事件&冒泡
- C++中MFC的消息映射机制与C#的事件驱动机制对比
- C# 事件机制
- Nginx——事件驱动机制(惊群问题,负载均衡)
- 源码-JavaScript&jQuery交互式前端开发-第6章-事件-鼠标事件-浮层的显示与关闭
- JavaScript事件循环(Event Loop)机制
- javascript打造跨浏览器事件处理机制[Blue-Dream出品]
- [转]javascript事件注册机制
- silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)