随着计算机硬件的不断升级,开发者愈加以为Javascript
性能优化的好很差对网页的执行效率影响不明显,因此一些性能方面的知识被不少开发者忽视。但在某些状况下,不优化的Javascript
代码必然会影响用户的体验。所以,即便在当前硬件性能已经大大提高的时代,在编写Javascript
代码时,若能遵循Javascript
规范和注意一些性能方面的知识,对于提高代码的可维护性和优化性能将大有好处。那么,接下来咱们讨论几种可以提升JavaScript性能
的方法。javascript
<script>
标签放到
<body>
标签的底部
js
文件,减小页面中
<script>
标签改善性能
defer
属性,加载后续文档元素的过程将和
script.js
的加载并行进行,可是
script.js
的执行要在全部元素解析完成以后,
DOMContentLoaded
事件触发以前完成。
async
属性,加载和渲染后续文档元素的过程将和
script.js
的加载与执行并行进行
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'file.js';
document.getElementsByTagName('head')[0].appendChild(script);复制代码
标识符所在的做用域链的位置越深,那么它的标识符解析的性能就越慢。因此一个好的性能提高的经验法则是:若是某个跨做用域的值在函数中被引用一次以上,那么就把它存储到局部变量里。css
function fun1() {
// 将全局变量的引用先存储在一个局部变量中,而后使用这个局部变量代替全局变量,从而提升
// 性能;否则每次(3次)都要遍历整个做用域链找到
document var doc = document;
var bd = doc.body;
var links = doc.getElementsByTagName('a');
doc.getElementById('btn').onclick = function(){
console.log('btn');
}
}复制代码
方法或属性在原型链中存在的位置越深,搜索它的性能也就越慢,因此要避免N多层原型链的写法。java
对象的嵌套成员,对象成员嵌套越深,读取速度也就越慢。因此好的经验法则是:若是在函数中须要屡次读取一个对象属性,最佳作法是将该属性值保存在局部变量中,避免屡次查找带来的性能开销。编程
function f() {
// 由于在如下函数中须要3次用到DOM对象属性,因此先将它存储在一个局部变量
// 中,而后使用这个局部变量代替它进行后续操做,从而提升性能
var dom = YaHOO.util.Dom;
if(Dom.hasClass(element,'selected')){
Dom.removeClass(elemet,'selected');
}else{
Dom.addClass(elemet,'selected');
}
}复制代码
用js
访问和操做DOM
都会带来性能损失,可经过如下几点来减小性能损失:数组
DOM
访问次数;
DOM
节点,请使用局部变量存储它的引用;
HTML
集合,由于它实时连系着底层文档;咱们能够把集合的长度缓存到一个变量中,并在迭代中使用它;
DOM
元素;offsetTop,offsetLeft,offsetWidthoffsetHeight,
scrollTop,scrollLeft,scrollWidth,scrollHeight,clientTop,clientLeft,clientWidth,clientHeight,getComputedStyle()
等;function f() {
// 推荐使用如下操做
var el1 = document.getElementById('mydiv');
el1.style.cssText = 'border:1px;padding:2px;margin:3px';
// 不推荐使用如下操做
var el2 = document.getElementById('mydiv');
el2.style.border = '1px';
el2.style.padding = '2px';
el2.style.margin = '3px';
}复制代码
DOM
时,能够经过如下步骤减小重绘和重排的次数:DOM
元素绑定事件以及浏览器须要跟踪每一个事件处理器都须要消耗性能。str += 'one'+'two';
str= str+'one'+'two';复制代码
建立对象和数组推荐使用字面量,由于这不只是性能最优也有助于节省代码量。浏览器
var obj = {
name:'tom',
age:15,
sex:'男'
}复制代码
若是须要遍历数组,应该先缓存数组长度,将数组长度放入局部变量中,避免屡次查询数组长度。缓存
JS
提供了三种循环:for(;;)、while()、for(in)
。在这三种循环中 for(in)
的效率最差,由于它须要查询Hash键,所以应尽可能少用for(in)
循环,for(;;)、while()
循环的性能基本持平。性能优化
尽可能少使用eval
,每次使用eval
须要消耗大量时间,这时候使用JS
所支持的闭包能够实现函数模板。bash
当须要将数字转换成字符时,采用以下方式:"" + 1
。从性能上来看,将数字转换成字符时,有以下公式:("" +) > String() > .toString() > new String()
。String()
属于内部函数,因此速度很快。而.toString()
要查询原型中的函数,因此速度逊色一些,new String()
须要从新建立一个字符串对象,速度最慢。闭包
当须要将浮点数转换成整型时,应该使用Math.floor()
或者Math.round()
。而不是使用parseInt()
,该方法用于将字符串转换成数字。并且Math
是内部对象,因此Math.floor()
其实并无多少查询方法和调用时间,速度是最快的。