目录
-
性能测试工具的介绍
- 应用流程
-
JS 代码优化
- 慎用全局变量
- 缓存全局变量
- 通过原型新增办法
- 避开闭包陷阱
- 防止属性拜访办法应用
- for 循环优化
- 抉择最优的循环办法
- 节点增加优化
- 克隆优化节点操作
- 间接量替换 new Object
性能测试工具的介绍
性能工具能够辅助咱们晓得如何写代码是更高效的,其本质上就是采集大量的执行样本进行数学统计和剖析。
- 应用基于
Benchmark.js
的 jsperf.com 实现,目前这个网站始终502
,感兴趣能够本地部署npm i benchmark --save-dev
一下瞅瞅 - 代替网站能够应用 jsbench.me
应用流程(因为始终 502 目前没有应用过)
- 登录
- 填写具体的测试用例信息(
title
/slug
是短名称,会生成一个网址,因而不可与他人的反复。) - 填写筹备代码(
DOM
操作时常常应用) - 填写必要有
setup
(启动操作)与teardown
(执行实现后销毁操作)代码
JS 代码优化
代码优化的品种很多,先简略介绍几个,这也是一个积攒的过程,当前有遇到的就在这外面减少
慎用全局变量
为什么要慎用?
- 全局变量定义在全局执行上下文,是所有作用域链的顶端。每次查找的时候都从部分找到最顶端,工夫会有所耗费。
- 全局执行上下文始终存在于上下文执行栈,直到程序退出,内存空间节约。
- 如果某个部分作用域呈现了同名变量则会 遮蔽或净化全局。
下图不看性能,只是想阐明用全局变量和不必全局变量的差异:
缓存全局变量
将应用中无奈防止的全局变量缓存到部分,上面能够看到缓存过的比没有缓存过的性能要有所提高。
通过原型新增办法
尽量在原型对象上新增实例对象须要的办法,而不是在构造函数外部增加办法。
避开闭包陷阱
闭包能够在内部作用域拜访函数外部作用域的数据。
- 闭包是一种弱小的语法
- 闭包使用不当很容易呈现内存泄露
- 不要为了闭包而闭包
实例剖析
上面代码造成了一个闭包,el
存在 foo
函数的作用域外面,而 onclick
指向的匿名函数又是一个新的作用域,外面援用了 foo
作用域中的id
,会导致内存泄露。
function foo() {var el = document.getElementById('btn')
el.onclick = function() {console.log(el.id)
}
}
foo()
想要内存不泄露,应用完之后将 el
置为null
function foo() {
// 等号左边的代码原本就存在于 `DOM` 树上,`el` 是一个新的援用。// 这个元素被咱们援用了两次。就算 `DOM` 被 `remove` 掉了,然而代码 `el` 中也会援用,只能在上面把代码进行手动革除。var el = document.getElementById('btn')
el.onclick = function() {console.log(el.id)
}
// 如果想要不泄露,就增加上面这个
el = null
}
foo()
防止属性拜访办法应用
JavaScrip
t 中的面向对象中
JS
不须要属性的拜访办法,所有属性都是内部可见的- 属性拜访办法只会减少一层重定义,没有拜访的控制力
for 循环优化
把数组的 length
也寄存到一个变量上。
抉择最优的循环办法
forEach
、for
、for-in
的比拟
节点增加优化
节点的增加操作必然会有回流和重绘
document.createdocumentfragment()
办法创立了一虚构的节点对象,是一段新的文档片段,该对象蕴含所有属性和办法。
这样能够合并节点的增加操作,缩小 DOM
的重绘。
克隆优化节点操作
曾经有的属性和内容不必再次增加
间接量替换 new Object
当咱们定义对象和数组的时候,咱们能够用new
,也能够采纳字面量。