读《JavaScript权威指南》(张亚飞)这本书后对提高JavaScript性能的一些整理笔记
文档瘦身
将js程序部署到服务器之前应先进行优化,其中可以减少js程序文档,从而减少网络流量,所以可以对文档的一些无用内容是进行删除。
- 删除注释 ,但法律和版权部分需要保留(运行代码不需要注释)
- 替换长的变量名为短的变量名
- 使用0,1代替false和true
- 使用[]代替new Array(),使用{}代替new Object()
- 如果一次性定义多个变量,尽量在一行内定义
控制内存
JavaScript没有析构方法来显式的清理内存,用于执行js程序的解释引擎是自动管理内存的。自动管理意味着定期回收内存垃圾。所以当一个变量不再使用时将它赋值为null ,告诉解释引擎这个变量符合垃圾回收的条件。可以节省内存。
- 对象不用时赋值为null
- 对象属性不用可以用delete删除对象属性。
- 数组元素或者复合数不用可以赋值null
优化代码的一些常识
- 如果函数中语句较多,不宜在循环语句中多次调用,尽量分割成具有部分功能的小函数。
- 尽可能使用内建函数,内建函数是经过多次优化的,一般比用户自定义的函数运行速度更快。
- 在开始循环前,先将Array.length赋予变量,将变量作为条件使用。而不是使用Array.length本身.也可以使用反转循环使用,可以节省一个变量
如
For(var i = myArray.length;i>=0;i--){
//do something
}
-
注重优化循环的所有循环动作
避免在循环体内部声明变量(for循环初始化会创建一个函数级变量而不是循环级,所以在for循环中定义变量和在循环体外定义变量是一样的)
For in 循环可以枚举任何对象的属性名,但速度比for循环和while循环慢,在属性和数量未知的情况下才用。 -
使用try catch语句时 要在finally语句中释放占用的资源,否则在catch到错误时所占用的资源不会释放
-
避免使用递归和嵌套循环,不得已才用,他们会严重影响性能
继承会增加方法调用的数量,而且会使用更多的内存,因此用户需要再类的扩展性和代码有效性中作出取舍 -
在局部变量够用时不使用全局变量,局部变量会比全局变量更快找到。
-
避免使用with语句,with 语句可以改变作用域链,他会使函数的所有局部变量出现在第二个作用域链对象中。
-
SetTimeout()和setInterval()函数不推荐用字符串作为首个参数,如果传递一个字符串,解释引擎会使用函数构造器创建一个新函数,在一些浏览器中会比较慢。
如
Window.setInterval(“someFunction()”,1000);
推荐
Window.setInterval(someFunction,1000);
//或者
Window.setInterval(function(){/**do something/},1000);
- 函数缓存 将函数方法赋给一个变量是一个很好的编程习惯,jquery经常使用$(id)来获取元素引用也是利用了函数缓存
页面重构
一. 优化DOM reflow
-
能直接使用innerHTML就不要使用DOM,DOM要比直接生产代码慢,但是新版的WebKit内核的浏览器DOM方法更快
-
将元素从document 中删除,完成修改再把元素放回原来的位置
-
将元素的display设置为none完成修改后再把display修改为原来的值
-
在使用DOM时,可以使用文档片段(DocumentFragment)来缓存过程中的元素
二. 优化Repaint
-
Repaint其实就是css导致的,所以要注意
尽可能少的修改元素style上的属性,尽量通过className来修改样式 -
通过cssText属性一次性将样式设置到对象
-
避免设置过多的行内样式
-
避免使用表格布局
附上一篇写的很好关于前端优化的帖子【前端性能优化】