高性能javascript及页面注意事项
1.少用全局变量
原因:因为作用域链是一个堆栈的结构,所以遵循先进先出的原则,而javascript引擎在解析代码的时候,将全局对象放在栈底,然后向上依次出现的是不同作用域的活动对象(这些活动对象除了闭包没有相互依赖的关系),所以在查找变量的时候会从该活动对象开始,然后是闭包它的活动对象,最后是全局对象,如果全局变量过多就会影响获得变量时的速度,所以不要过多使用全局变量。
2.尽量使用局部变量封装全局变量
原因:正如前面所说,活动对象在栈的顶端,所以最先查找它的内容,当我们将document封装成局部变量后就会减少深层次查找的次数,使性能提高。
3.操作数组长度、对象属性时,尽量使用局部变量封装。
原因:IE、opera存取数组比对象属性快,而FF chrome safari正好相反,所以兼顾这些,我们最好封装一下。
4.尽量减少对象属性的深度
原因:深度太大,会增加javascript引擎对取得值的地址查找的开销,相当于增加了多层嵌套的指针,导致性能损失。
5.在for循环中尽量使用局部变量封装条件项
原因:例如for(var i=0;i<divs.length;i++) 的时候,如果divs为document.getElementsByTagName('div'),这样在每次循环判断条件的时候都会对DOM文档进行一次遍历求得长度,所以讲length封装起来,会提升性能。
6.谨慎的处理HTMLcollection对象(比如childNodes getElementsByTagName等取得DOM元素集合的对象),最好将其封装到数组里操作。
原因:还是因为操作DOM元素需要遍历DOM文档,而非DOM元素则不用遍历,所以请尽量减少对DOM的操作,而将DOM集合放到数组中去。
7.在针对safari浏览器的开发过程中,请尽量使用“.”获取对象属性而不是用“[]”。
8.建议在少于两次判断的环境下使用if-else,而大于三次的就用switch吧。而超过10次的时候,还是使用数组或json对象来通过索引来查找吧(这种模式相对简单)
9.如果循环数组的顺序从低到高或从高到低没有差别,那么还是从高到低比较好,比如我们循环输出一个数组中的内容:
- var arr=[1,2,3,4,5];
- var i=0;
- while(i<arr.length){
- alert(arr[i]);
- }//这样开销会比较大,因为每次都要遍历求出数组元素的长度
- //----------------------------------
- var i=arr.length;
- while(i--){
- alert(arr[i]);
- }//使用局部变量保存数组长度,然后该变量自减,连while中的判断都省了,因为0转换为布尔值就是false。
10.尽量少使用for-in循环,将其尽量改造成while 或for循环。
11.处理大数组时,请遵循duff策略。
duff策略:将大数组的个数拆分成8个一组,对这8个为一个单位的数组的操作不用循环处理,而是不怕繁琐的写出8行处理数组元素的代码,这样会提升大数组操作的性能。
12.用函数处理大数组的每个元素时,尽量使用定时器将每次操作挂起,时间设定在50-100ms比较合理
原因:如果简单的用循环来处理数组中的每个元素,如果是大数组,会造成页面的冻结和假死,给用户不好的体验,而用setTimeout,就会把每次操作都暂时挂起,让javascript引擎有其他的时间去处理队列中的其他函数,有效的防止了冻结和假死,而在设定的延迟时间之后,有可能javascript引擎是空闲的状态,可以更好的处理这些数组操作。相当于虚拟了一个后台操作。下面是zakas提出的解决方案:
- function chunk(array,func,context){
- setTimeout(function(){
- var arr=array.shift();
- func.call(context,item);
- if(array.length>0){
- setTimeout(arguments.callee,100);//递归循环这个过程 arguments.callee为chunk这个函数对象
- }
- },100);
- }
13.在使用iframe的时候注意window onload的阻塞
原因:iframe的加载会对window onload进行阻塞,导致有些window unload事件中加载的代码在用户关掉页面的时候可能不被执行,所以需要我们最好在window onload时间发生时动态为iframe设定src属性。
PS:能不用iframe就不用。
14.CSS选择符的优化
原因:CSS选择符的读取方式为从右至左,所以在写的时候尽可能右边规则详细,而且尽量少用子选择符合后代选择符标签选择符。
高性能javascript及页面注意事项的更多相关文章
- "Javascript高性能动画与页面渲染"笔记
前言:好久没翻阅我的gmail邮箱了,午休时就打开看了一下,看到InfoQ推荐的一篇名为“Javascript高性能动画与页面渲染”文章,粗略的看了一下,很赞!讲的很详细,对好些细节讲的都很好,很通俗 ...
- 《高性能javascript》一书要点和延伸(上)
前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...
- 《高性能javascript》 领悟随笔之-------DOM编程篇(二)
<高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...
- 《高性能javascript》 领悟随笔之-------DOM编程篇
<高性能javascript> 领悟随笔之-------DOM编程篇一 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...
- 高性能javascript学习笔记系列(6) -ajax
参考 高性能javascript javascript高级程序设计 ajax基础 ajax技术的核心是XMLHttpRequest对象(XHR),通过XHR我们就可以实现无需刷新页面就能从服务器端读 ...
- 高性能javascript学习笔记系列(5) -快速响应的用户界面和编程实践
参考高性能javascript 理解浏览器UI线程 用于执行javascript和更新用户界面的进程通常被称为浏览器UI线程 UI线程的工作机制可以理解为一个简单的队列系统,队列中的任务按顺序执行 ...
- 高性能JavaScript 编程实践
前言 最近在翻<高性能JavaScript>这本书(2010年版 丁琛译),感觉可能是因为浏览器引擎的改进或是其他原因,书中有些原本能提高性能的代码在最新的浏览器中已经失效.但是有些章节的 ...
- 高性能javascript学习笔记系列(3) -DOM编程
参考 高性能javascript 文档对象模型(DOM)是独立于语言的,用于操作XML和HTML文档的程序接口API,在浏览器中主要通过DOM提供的API与HTML进行交互,浏览器通常会把DOM和ja ...
- 高性能javascript学习笔记系列(1) -js的加载和执行
这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令 ...
随机推荐
- jqGrid(2)
jqGrid使用方法: 原文地址:http://blog.csdn.net/y0ungroc/article/details/12008879 1. 下载文件 1. 下载jqGrid的软件包, ...
- VS2013+Qt5.6+VSaddin1.2.5
1 下载Qt(1)Qt安装包http://download.qt.io/official_releases/qt/(2)Qt插件http://ftp.jaist.ac.jp/pub/qtproject ...
- MongoDB牛刀小试
MongoDB基本操作 1.MongoDB的启动 首先创建一个目录作为MongoDB的工作目录: 进入MongoDB的bin目录: 执行mongod命令,使用参数--dbpath指定MongoDB的工 ...
- bzoj 3223/tyvj 1729 文艺平衡树 splay tree
原题链接:http://www.tyvj.cn/p/1729 这道题以前用c语言写的splay tree水过了.. 现在接触了c++重写一遍... 只涉及区间翻转,由于没有删除操作故不带垃圾回收,具体 ...
- 在meteor中如何使用ionic组件tabs,及如何添加使用cordova plugin inappbrower
更新框架: meteor update meteor框架的优点不言而喻,它大大减轻了App前后端开发的负担,今年5月又获得B轮2000万融资,代表了市场对它一个免费.开源开发框架的肯定.cordova ...
- Block 块
代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱字符(^)是块的语法标记.按照我们熟悉的参数语法规约所定 ...
- 一位iOS教育类应用开发者是如何赚到60多万美元?
注:伯乐在线12月19日在@程序员的那些事 微博推荐了此文的英文原文,非常感谢@dotSlash 的翻译. 转眼距我写<我如何在iOS教育类应用中赚到20万美元>这篇博文已经一年多了,它 ...
- java读取资源文件
ResourceBundle bundle = ResourceBundle.getBundle("cn.liuning.resource.MessageResource"); b ...
- 局域网内Tomcat服务器没法访问
多半是防火墙的问题,在server2008上打开防火墙设置,关闭即可访问,不关闭的访问方式暂时好没研究出来
- java web.xml配置详解(转)
源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...