1.将脚本放在底部

  javascript是阻塞式的加载,如果先加载脚本,后面的dom都没有办法进行渲染,页面会是一片空白;

  采用无阻塞下载javascript

  a.使用<script>标签的defer属相

  b.使用动态创建的<script>元素下载并执行元素

2.打包脚本,减少页面<script>标签

  考虑到http请求会带来额外的性能开销,下载单个的100K的文件比下载5个20k的文件更快。所以尽量减少外链脚本的数量

3.定义局部变量

  引擎首先从this开始查找局部变量,然后是函数参数,然后是本地定义的变量,最后遍历所有的全局变量

4.尽量少访问DOM操作

  a.对于多次访问同一属性,建议存储到一个局部变量替代 

  1. //不好
  2. var blah = document.getElementById('myID'),
  3. blah2 = document.getElementById('myID2');
  4.  
  5. //更好的做法
  6. var doc = document,
  7. blah = doc.getElementById('myID'),
  8. blah2 = doc.getElementById('myID2');

  b.通过模板clone,替代createElement;(前提是创建一个模板元素)

  1. var frag = document.createDocumentFragment();
  2. for (var i = 0; i < 1000; i++) {
  3. var el = document.createElement('p');
  4. el.innerHTML = i;
  5. frag.appendChild(el);
  6. }
  7. document.body.appendChild(frag);
  8. //替换为:
  9. var frag = document.createDocumentFragment();
  10. var pEl = document.getElementsByTagName('p')[0];
  11. for (var i = 0; i < 1000; i++) {
  12. var el = pEl.cloneNode(false);
  13. el.innerHTML = i;
  14. frag.appendChild(el);
  15. }
  16. document.body.appendChild(frag);

  c.通过firstChild和nextSibling替代childNodes遍历的元素

  1. var nodes = element.childNodes;
  2. for (var i = 0, l = nodes.length; i < l; i++) {
  3. var node = nodes[i];
  4. //……
  5. }
  6. //更好的做法
  7. var node = element.firstChild;
  8. while (node) {
  9. //……
  10. node = node.nextSibling;

  d.删除dom节点之前,一定要删除该节点上的注册事件,否则将会产生无法回收的内存

5.减少因DOM操作,引起的reflow和repaint

  DOM操作会导致一些列的repaint和reflow操作。在一般浏览器中,repaint的速度远快于reflow的速度,所以要尽量避免reflow操作

  应对方案:

  a.使用容器存放临时变更,最后一次性更新到DOM

  1. //不好的做法
  2. for(var i=0;i<items.length;i++){
  3. var item = document.createElement("li");
  4. item.appendChild(document.createTextNode("Option"+i));
  5. list.appendChild(item);
  6. }
  7. //好的做法
  8. //使用容器存放临时变更,最后一次性更新到DOM
  9. var fragment =document.createDpcumentFragment();
  10. for(var i=0;i<items.length;i++){
  11. var item = document.createElement("li");
  12. item.appendChild(document.createTextNode("Options"+i));
  13. fragment.appendChild(item);
  14. }
  15. list.appendChild(fragment);

  b.先将DOM节点删除或者隐藏,因为隐藏的节点不会触发reflow

  1. list.style.display = "none";
  2. for (var i=0; i < items.length; i++){
  3. var item = document.createElement("li");
  4. item.appendChild(document.createTextNode("Option " + i);
  5. list.appendChild(item);
  6. }
  7. list.style.display = "";

  c.一次性修改样式属性

  1. // 不好的做法
  2. // 这种做法会触发多次重排
  3. element.style.backgroundColor = "blue";
  4. element.style.color = "red";
  5. element.style.fontSize = "12em";
  6.  
  7. // 更好的做法是,把样式都放在一个class下
  8. .newStyle {
  9. background-color: blue;
  10. color: red;
  11. font-size: 12em;
  12. }
  13. element.className = "newStyle";

6.DOM相同事件操作尽量采用事件托管

  如果对ul下的所有li添加一个onclick,如果用for循环来实现这个操作的话,会多次操作DOM树,如果用事件托管,将onclick事件托管给父元素,只需要操作父元素即可。

7.尽量不要使用闭包,闭包不能释放被引用的变量,也会影响web性能

  

javascript performence的更多相关文章

  1. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  2. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  3. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  4. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  5. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  6. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  7. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  8. JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome

    今天为大家分享一下我自己制作的浏览器滚动条,我们知道用css来自定义滚动条也是挺好的方式,css虽然能够改变chrome浏览器的滚动条样式可以自定义,css也能够改变IE浏览器滚动条的颜色.但是css ...

  9. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

随机推荐

  1. Ubuntu 12.04 修改键盘映射

    背景: (1) 我的笔记本G450上,Page_up/Page_down键分别和Home/End在同一个键位上,需要同时按住Fn键才能敲出Home/End (2) 习惯用Vim的同志都有这个感觉,Es ...

  2. Zeppelin0.5.6使用hive解释器

    此zeppelin为官方0.5.6版,可能还在孵化阶段,可能出现一些bug吧. 配置 cp zeppelin-env.sh.template zeppelin-env.sh vi zeppelin-e ...

  3. stm32

    GPIO NVIC TIME USART ONE WIRE IIC SPI PWM ADC LCD XPT UCOSiii移植 定时器 蓝牙 陀螺仪

  4. HDU 1329 Hanoi Tower Troubles Again!(乱搞)

    Hanoi Tower Troubles Again! Problem Description People stopped moving discs from peg to peg after th ...

  5. iframe自适应高度处理方案

    第一种:这个方案能解决大多数自适应高度问题,方法是在iframe所要加载的页面上添加代码,把它的高度告诉iframe所在页面.缺点显而易见,如果iframe要加载的页面非常多而且不固定那么代码加起来很 ...

  6. js常用语句写法

    1.for语句 for(var i = 0; i<6; i++) //0,1,2,3,4,5

  7. emmet 教程 emmet快捷键大全

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

  8. Request.UrlReferrer为空的问题

    Request.UrlReferrer为空的问题   今天在开发时遇到了一个问题,在用Request.UrlReferrer获取上一页面的地址时发现该对象为空(IE下,FF下可以得到对象),于是上网搜 ...

  9. Sublime的Package Control的安装

    最近在用Sublime,我想很多人和我一样都是先要安装PackageControl吧! 可是看了网上的好多博客感觉都太繁琐了 对于像我这样的小白来说实在有很多看不懂的地方 相对来说还是官网的那种方法更 ...

  10. Codeforces Round #346 (Div. 2) C Tanya and Toys

    C. Tanya and Toys 题目链接http://codeforces.com/contest/659/problem/C Description In Berland recently a ...