编写高性能的JavaScript

随着计算机硬件的不断升级,开发者愈加以为Javascript性能优化的好很差对网页的执行效率影响不明显,因此一些性能方面的知识被不少开发者忽视。但在某些状况下,不优化的Javascript代码必然会影响用户的体验。所以,即便在当前硬件性能已经大大提高的时代,在编写Javascript代码时,若能遵循Javascript规范和注意一些性能方面的知识,对于提高代码的可维护性和优化性能将大有好处。那么,接下来咱们讨论几种可以提升JavaScript性能的方法。javascript

一、js文件加载和执行

(1)将 <script>标签放到 <body>标签的底部
(2)能够合并多个 js文件,减小页面中 <script>标签改善性能
(3)使用 defer 属性,加载后续文档元素的过程将和 script.js 的加载并行进行,可是 script.js 的执行要在全部元素解析完成以后, DOMContentLoaded 事件触发以前完成。
(4)使用 async 属性,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行
(5)动态加载脚本元素,不管在什么时候启动瞎子,文件的下载和执行过程都不会阻塞页面其它进程

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');  
 }
}复制代码

五、DOM操做

js访问和操做DOM都会带来性能损失,可经过如下几点来减小性能损失:数组

(1)尽量减小 DOM访问次数;
(2)若是须要屡次访问某个 DOM节点,请使用局部变量存储它的引用;
(3)当心处理 HTML集合,由于它实时连系着底层文档;咱们能够把集合的长度缓存到一个变量中,并在迭代中使用它;
(4)下述状况会发生重排:
  • 添加或删除可见的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,每次使用eval须要消耗大量时间,这时候使用JS所支持的闭包能够实现函数模板。bash

十一、字符串转换

当须要将数字转换成字符时,采用以下方式:"" + 1。从性能上来看,将数字转换成字符时,有以下公式:("" +) > String() > .toString() > new String()String()属于内部函数,因此速度很快。而.toString()要查询原型中的函数,因此速度逊色一些,new String()须要从新建立一个字符串对象,速度最慢。闭包

十二、浮点数转换整形

当须要将浮点数转换成整型时,应该使用Math.floor()或者Math.round()。而不是使用parseInt(),该方法用于将字符串转换成数字。并且Math是内部对象,因此Math.floor()其实并无多少查询方法和调用时间,速度是最快的。

以上就是总结的12条 JavaScript高性能编程的一些建议,但愿对你有借鉴之处,若是对你有启发,请点赞鼓励,若是有疑问或建议,欢迎留言讨论。

相关文章
相关标签/搜索