找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1739|回复: 0

[分享] 30个提高Web程序执行效率的好经验

[复制链接]
发表于 2013-3-26 15:06:22 | 显示全部楼层 |阅读模式 来自 中国–广东–湛江

尽量避免使用DOM。当需要反复使用DOM时,先把对DOM的引用存到JavaScript本地变量里再使用。使用设置innerHTML的方法来替换document.createElement/appendChild()方法。
eval()有问题,new Fuction()构造函数也是,尽量避免使用它们。
拒绝使用with语句。    它会导致当你引用这个变量时去额外的搜索这样的一个命名空间,with里的代码在编译时期是完全未知的。
使用for()循环替代for…in循环。因为for…in循环在开始循环之前需要Script引擎创建一个含有所有可循环属性的 List,需要多检查一次。
把try-catch语句放在循环外面,不要放在循环里面,因为异常是很少发生的,放在外面避免每次都要执行它们。
甚至圣经里都提到过这个– 不要全局的。全局变量的生命周期贯穿整个脚本的生命周期,而本地变量的存在范围随着本地命名空间的销毁而消失。当在函数或其它地方引用一个全局变量时,脚本引擎需要搜索整个全局命名空间。
fullName += 'John'; fullName += 'Holdings';执行速度快于fullName += 'John'+'Holdings';
如果你需要把多个字符串连接起来,最好是把他们做成一个数组,然后调用join()方法实现这个操作。这种方式在生成HTML片段时尤其有效。
对于简单的任务,最好使用基本操作方式来实现,而不是使用函数调用实现。例如val1 < val2 ? val1 : val2;执行速度快于Math.min(val1, val2);,类似的,myArr.push(newEle);慢于myArr[myArr.length] = newEle;
将函数的引用作为参数传递到setTimeout()和setInterval()里优于将函数名作为字符串参数传递(硬编码)。例如,setTimeout("someFunc()",    1000)执行效率慢于setTimeout(someFunc,    1000)
当进行遍历操作时避免使用DOM操作。通过像getElementsByTagName()这种方法得到的DOM元素队列都是动态的;有可能在你还没有对它遍历完成时,它已经被改变。这有可能导致死循环。
当你对对象的成员(属性或方法)进行反复操作时,先存储对它们的引用。例如var     getTags = document.getElementsByTagName; getTags('div');
在任何的代码段里,在局部变量范围外存放一个这个局部变量的引用。例如
function foo(arr){
var a = 'something'; //变量'a'对于下面的一段就是范围外变量,这个变量的引用在很多情况下会有用处。
for (var i = 0, j = a, loopLen = arr.length; i    < loopLen; i++){
//do something
}
}
  
for(var i=0; i < someArray.length; i++) {&hellip;}的执行效率慢于for (var i=0,    loopLen=someArray.length; i<loopLen; i++){&hellip;}。
在HTTP头信息里加入缓存控制过期和最大存活时间标记。
优化CSS。要使用<link>方式,而不要使用@import方式。
使用CSS技术来优化图片资源
用GZip方式压缩.js 和.css 文件。如果你使用的是Apache,在   .htaccess 里设置压缩方式,你的HTML, XML 和 JSON 也同时会被压缩。
AddOutputFilterByType DEFLATE text/html  text/css text/plain    text/xml application/x-javascript application/json
使用JavaScript压缩工具。除了使用YUI和JSMin外,你还可以试一试Google     Closure  (感谢: James Westgate,一位读者)
优化每个页面上的各种资源,把它们拆分到各个子域上,这么它们就能够并行下载。
将CSS样式表放在页面的最顶端,这样能方便包括IE在内的浏览器进行解析。
尽量将DOM结构保持的越简单越好。DOM的体积会影响相关的操作效率,像查找,   遍历,DOM改动都有影响。document.getElementsByTagName('*').length这个值越小越好。
注意你使用的选择器。例如,如果你想获取一个ul下的直接子元素,使用jQuery("ul > li")而不要使用jQuery("ul li")
当切换元素的可见性时(display),请记住:element.css({display:none})的速度快于element.hide() 和 element.addClass('myHiddenClass')。   除非在一个循环里,我选择element.addClass('myHiddenClass'),这样会使代码更简洁&ndash;不要使用    inline CSS 和 JavaScript。
当你使用完对DOM的引用变量后,要把它置为NULL。
使用AJAX时,GET的执行效率高于POST。所以要尽量使用 GET 方式。只是要注意一点,IE只允许你用GET传送2K的数据。
小心使用脚本动画。没有硬件的支持,动画会执行的很慢。尽量避免使用那些没有实际价值的动画效果。
如果你的background-image对于这个图片的容器太小的话,请避免使用background-repeat。如果你的背景图片需要来回填充很多次才能充满背景,那么将background-repeat属性设置成background-image 和repeat-x 或 repeat-y来达到填充背景的效果的做法是不明智的,这种填充方式的效率特别的低。你应该尝试使用一个足够大的图片来做background-image并且使用background-repeat:    no-repeat。
布局时不要使用<table>。 <table>在浏览器完全把它画出来之前需要反复绘制好几次。因为DOM中<table>是很少见的一种之后输出的会影响之前输出的显示效果的元素。对于表格数据来说,你可以使用table-layout:fixed;   这是一种更有效的现实算法,根据CSS 2.1技术说明,这种写法可以让表格一行一行的输出。
尽可能的使用原始JavaScript。限制JavaScript框架的使用。

发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;

如何回报帮助你解决问题的坛友,好办法就是点击帖子下方的评分按钮给对方加【金币】不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 需要先绑定手机号

关闭

站长推荐上一条 /1 下一条

QQ|侵权投诉|广告报价|手机版|小黑屋|西部数码代理|飘仙建站论坛 ( 豫ICP备2022021143号-1 )

GMT+8, 2024-12-23 09:03 , Processed in 0.041669 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表