1.setTimeout()、setInterval()详解和应用

1.1 详解: setTimeout、setInterval执行时机
1.2 存在问题: setInterval重复定时器可能存在的问题、解决方案
1.3 应用: Yeilding Processes(进程暂停)

​ 运行在浏览器中的JavaScript都被分配了一个确定数量的资源,不同于桌面应用往往能够随意控制他们要的内存大小和处理时间,Javascript被严格限制了,以防止恶意的Web程序员吧用的计算机搞挂了,其中一个限制是长时间运行脚本的制约,如果代码运行超过特定时长或者特定数量的语句就不让它继续执行,询问是允许其继续执行还是停止它。所有JavaScript开发人员的目标就是,确保用户永远不会再浏览器中看到这个令人费解的对话框。定时器是绕开此限制的方法之一

脚本运行时间长的2个原因

​ 1.过长的、过深嵌套的函数调用;

​ 2.进行大量处理的循环;

​ 这2种后者较为容易的被解决

进行大量处理的循环

​ 使用这种方式必须满足的要求:

​ 1.该处理不是必须同步完成

​ 2.数据不是必须按顺序完成

解决方案:数组分块

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

使用场景建议:

​ 一旦某个函数的执行需要花50ms以上的时间完成,那么最好看看能否将任务分割为一系列可以使用定时器的小任务。

1.4 应用:函数节流

1.4.1 节流函数的起源

​ 浏览器中的某些计算和处理要比其他的开销大很多。例如,DOM比起非DOM交互需要更多的内存和CUP时间。连续尝试进行过多的DOM相关操作可能会导致浏览器挂起,有时候甚至奔溃。尤其在IE中使用onresize时处理程序的时候很容易发生,当调整浏览器大小的时候,该事件会连续触发。在onresize事件处理程序内部如果尝试进行DOM操作,其高频率的更改可能会让浏览器奔溃。为了绕开这个问题,可以使用定时器对该函数进行节流。

​ **1.4.2 节流函数的原理 **

​ 某段代码不能在没有间隔的情况下连续重复执行。

​ 第一次调用函数,创建一个定时器,在指定的时间间隔后执行代码,当第二次调用该函数时,他会清除前一次的定时器并设置另一个定时器。如果前一个定时器已经执行了,这个操作没有任何意义。然后,如果前一个定时器尚未执行,其实就是将其替换为一个新的定时器。目的只有一个:只有在执行函数的请求停止了一段时间之后才执行。

1.4.3 适合节流的场景:周期性执行的代码

​ **1.4.4 节流函数的实现 **

var processor = {
timeoutId: null,
performProcessing: function () {
//实际执行的代码
},
process: function () {
clearTimeout(this.timeoutId) var that = this
this.timeoutId = setTimeout(function () {
that.performProcessing()
}, 100)
}
}

​ **1.4.5 节流函数实现的简化 **

function throttle (cb, context) {
clearTimeout(cb.ID) cb.ID = setTimeout(function () {
cb.call(context)
}, 1000)
}

2.CSS加载是否影响DOM的解析和渲染

​ 给浏览器设置节流和延迟:使出现的效果能够在自己被自己察觉。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
h1 {
color: red!important;
}
</style>
<script>
function h () {
let h1 = document.getElementById('h1')
console.log( h1 )
}
setTimeout(h, 0)
</script>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body> <h1 id="h1">这是红色</h1> </body>
</html>

结果:在css正在下载时,h1标签被控制太打印出来,但是页面没有文字。

结论:css加载会阻塞DOM树渲染,不会阻塞DOM树的解析。

个人看法:这样子做还是符合优化的正常逻辑的,css不会阻塞解析;如果不阻塞css渲染,等这个css加载完成后,会触发回流和重绘额外增加性能开销,所以还不如直接等css加载完成后再来渲染。

3.css加载是否影响js加载?

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
h1 {
color: red!important;
}
</style> <script>
console.log('before css')
var startDate = new Date()
</script>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body> <h1 id="h1">这是红色</h1> <script>
var endData = new Date()
console.log('after css')
console.log('已经过了' + (endData - startDate))
</script>
</body>
</html>

结果:在css正在加载时,控制台内容:before css

​ css加载完成时,控制台内容:

before css
after css
已经过了3444

结论:css加载时,会阻塞js的执行。

4.js加载是否影响DOM的解析和渲染、js执行、css加载?

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.slim.min.js"></script>
<script>
console.log(1111)
</script>
<style>
h1 {
color: red!important;
}
</style>
</head>
<body> <h1 id="h1">这是红色</h1> </body>
</html>

现象:Loading js时,后续js没有执行,后续DOM没有解析。

结论:js加载阻塞中的js执行和DOM加载和解析。

5.css阻塞问题总结

  • css加载 不会阻塞DOM树解析
  • css加载会阻塞DOM树渲染
  • css加载会阻塞JS执行
  • js执行会阻塞后续js执行、css加载、DOM树的解析和渲染
  • js加载不会影响后续外部css下载

定时器详解和应用、js加载阻塞、css加载阻塞的更多相关文章

  1. STM32F103的11个定时器详解(转)

    源:STM32F103的11个定时器详解 STM32F103系列的单片机一共有11个定时器,其中:2个高级定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器 出去看门狗定时器和系统滴 ...

  2. 前端跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)

    1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正 ...

  3. Console命令详解,让调试js代码变得更简单

    Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些基本用法.今天,继续介绍它的高级用法. ======= ...

  4. [转] Console命令详解,让调试js代码变得更简单

    http://www.cnblogs.com/see7di/archive/2011/11/21/2257442.html Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上 ...

  5. SpringCloud 详解配置刷新的原理 使用jasypt自动加解密后 无法使用 springcloud 中的自动刷新/refresh功能

    之所以会查找这篇文章,是因为要解决这样一个问题: 当我使用了jasypt进行配置文件加解密后,如果再使用refresh 去刷新配置,则自动加解密会失效. 原因分析:刷新不是我之前想象的直接调用conf ...

  6. ATmega328P定时器详解

    写这篇文章,纯粹是想为博客拉点点击量.在博客园,游客访问好像是不计入阅读量的,而作为一个十八线博主,注册用户的访问应该以搜索引擎为主,博客园首页为次,个位数的粉丝就别谈了. 所以,希望各位从搜索引擎点 ...

  7. oracle创建定时器详解|interval属性

    定时任务首先先创建定时任务中的存储过程 create or replace procedure pro_jggl as                                          ...

  8. 详解HTML5中rel属性的prefetch预加载功能使用

    在HTML5中,有个很有用但常被忽略的特性,就是预先加载(prefetch),它的原理是: 利用浏览器的空闲时间去先下载用户指定需要的内容,然后缓存起来,这样用户下次加载时,就直接从缓存中取出来,效率 ...

  9. 详解Java 8中Stream类型的“懒”加载

    在进入正题之前,我们需要先引入Java 8中Stream类型的两个很重要的操作: 中间和终结操作(Intermediate and Terminal Operation) Stream类型有两种类型的 ...

随机推荐

  1. PHP继承中$this的问题

    在父类中的构造函数中使用$this , 这是$this指的是正在实例化的子类对象,不管是parent还是继承调用父类的构造函数. 如: class CompanyController extends ...

  2. 分享知识-快乐自己:反射机制Demo解析

    Java-Reflect专题 基本反射简介: 1):JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象能够调用它的任意方法和属性;这种动态获取信息以及动 ...

  3. 负载均衡之IP

    文章出自:http://blog.csdn.net/cywosp/article/details/38036537       首先让我们来看看下面这张大家都非常熟悉的TCP/IP协议族的分层图:   ...

  4. vi 常用编辑命令

    什么是vi: vi是Linux/Unix底下最常用的文本编辑器,可以理解为和Windows下的txt一样,咱们一般操作linux服务器的时候都是没有图形化界面的, 怎么移动光标,到哪个位置,替换修改什 ...

  5. linux命令学习笔记(49):at命令

    在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...

  6. linux命令学习笔记(55):traceroute命令

    通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包 由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不 ...

  7. stl_vector.h

    stl_vector.h // Filename: stl_vector.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http ...

  8. Statement

    题目大意 给定一棵基环外向树,和若干组询问,对于每次独立的询问都指定一些起点和一些终点,你删去一些边,使得从任意起点出发都无法到达终点,并让删去的边的编号的最小值最大,求这个最大的最小值. 题解 不难 ...

  9. 【Lintcode】363.Trapping Rain Water

    题目: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...

  10. nginx用cookie控制访问权限实现方法

    自己的一个需求需要对a.b.com 下的 /c 这个目录下,cookie d=e 才能访问,如果不是,就重定向到f.html 下面看代码.  代码如下 复制代码 server{       serve ...