在 上一篇 中,从HTTP请求到页面渲染几个方面对提高网站性能提出了几点建议,本文是学习Steve Sounders的另外一本书《高性能网站建设进阶指南》之后,从JavaScript性能的角度进行总结概括,诸君共勉。

JavaScript性能是实现高性能Web应用程序的关键
——Steve Sounders

1 利用js作用域链

作用域链(scope chain)

当执行一段JavaScript代码(全局代码或函数)时,JavaScript引擎会创建为其创建一个作用域又称为执行上下文(Execution Context),在页面加载后会首先创建一个全局的作用域,然后每执行一个函数,会建立一个对应的作用域,从而形成了一条作用域链。每个作用域都有一条对应的作用域链,链头是全局作用域,链尾是当前函数作用域。

作用域链的作用是用于解析标识符,当函数被创建时(不是执行),会将this、arguments、命名参数和该函数中的所有局部变量添加到该当前作用域中,当JavaScript需要查找变量X的时候(这个过程称为变量解析),它首先会从作用域链中的链尾也就是当前作用域进行查找是否有X属性,如果没有找到就顺着作用域链继续查找,直到查找到链头,也就是全局作用域链,仍未找到该变量的话,就认为这段代码的作用域链上不存在x变量,并抛出一个引用错误(ReferenceError)的异常。

管理好作用域链的深度,是一种只要少量工作就能提高性能的简易方法,我们应避免因无意中增长了作用域链而导致执行速度变得缓慢。

  • 使用局部变量(尽量缩短作用域链)

如果理解了作用域链的概念,那么我们应该清楚JavaScript引擎对变量的解析时间跟作用域链的深度有关,显而易见,局部变量由于处于链尾,存取速度是最快的,因此,一个好的经验是:任何非局部变量使用超过一次时,请使用局部变量将其存储下来,例如:

function changeDiv(){document.getELementById('myDiv').className = 'changed';document.getELementById('myDiv').style.height = 150;
}

这里myDiv这个dom元素被引用了两次,为了更快的引用,我们应该用一个局部变量将其存储下来,这样做的好处不仅缩短了作用域链,而且避免了DOM元素的重复查询:

function changeDiv(){var myDivStyle = document.getElementById('myDiv').style;myDiv.className = 300;myDiv.style.height = 150;
}
  • 避免使用with(不要增长作用域链)

一般在代码执行过程中,函数的作用域链是固定的,然而with可以临时增长函数的作用域链。with用于将对象属性作为局部变量来显示,使其便于访问,例如:

var user = {name:'vicfeel',age:'23'
};function showUser(){var local = 0;with(user){console.log("姓名" + name);console.log("年龄" + age);console.log(local);}
}showUser();

这个例子中,通过with在showUser作用域链的链尾中又增加了一个临时作用域,该作用域存储着user对象的所有属性,也就是增长了with这段代码的作用域链,在这段代码中,局部变量像local从链尾的第一个对象变成了第二个,自然减慢了标识符的存取。直到with语句结束,作用域链恢复增长。正因为with的这个缺陷,我们应尽量避免使用with关键字。

2 更合理的流控制

JavaScript与其它编程语言一样,拥有一些流控制语句(循环、条件等),在每个环节上使用恰当的语句能极大的提高脚本的运行速度。

  • 快速条件判断

提到条件判断,首先要避免的一种使用方式:

if(value == 0){return result0;
}
else if(value == 1){return result1;
}
else if(value == 2){return result2;
}
else if(value == 3){return result3;
}
else if(value == 4){return result4;
}
else if(value == 5){return result5;
}
else if(value == 6){return result6;
}
else{return result7;
}

这种使用if进行条件判断的方式存在的主要问题是层次太深,当我要value = 7时,消耗时间要比value = 0长很多,大大损耗了性能,同时可读性很差。

一种更好的方式,利用switch进行判断。

switch(value){case 0:return result0;case 1:return result1;case 2:return result2;case 3:return result3;case 4:return result4;case 5:return result5;case 6:return result6;default:return result7;
}

这样不仅提高了可读性,查询时间也要比if更快。但是如果只有一两个条件时,if是比switch更快的

在JavaScript中,条件查询还有另外一种方式,之前的例子是根据值返回不同的值,刚好可以利用数组实现hash表的映射查询。

//定义数组
var results = [result0,result1,result2,result3,result4,result5,result6,result7];
//查询结果
return results[value];

这种数组的方式,在查询范围很大时才更加有效,因为它不必检测上下边界,只需要填入索引值就可以查询了。它的局限性在于条件对应的是单一值,而不是一系列操作。因此要综合实际情况,选择合适的条件判断方式,发挥性能最大化。

  • 快速循环

JavaScript中存在4种循环方式for循环、do-while循环、while循环和for-in循环。下面是一个很常用的循环使用方式:

var values = [1,2,3,4,5];
for(var i = 0;i < values.length;i++){process(values[i]);
}

我们可以看到,这段代码最明显可以优化的地方在于values.length,每次循环i都要和values的长度进行比较,而查询属性要比局部变量更耗时,如果循环次数越大,这种耗时就越明显,因此可以这样优化:

var values = [1,2,3,4,5];
var length = values.length;//局部变量存储数组长度
for(var i = 0;i < length;i++){process(values[i]);
}

这段代码还可以继续优化,将循环变量递减到0,而不是递加到总长度。

var values = [1,2,3,4,5];
var length = values.length;
for(var i = length;i--;){   //递减到0process(values[i]);
}

这里将循环结束改造为与0比较,所以每个循环的速度更快了,根据循环的复杂度不同,这种简单改变可以比原来节约大概50%的时间。

博文作者:vicfeel
博文出处:http://www.cnblogs.com/vicfeel
本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!
如果阅读了本文章,觉得有帮助,您可以为我的博文点击“推荐一下”!

转载于:https://www.cnblogs.com/vicfeel/p/5697207.html

关于提高网站性能的几点建议(二)相关推荐

  1. 通过延迟加载和代码拆分提高网站性能

    by José M. Pérez 由JoséM.Pérez 通过延迟加载和代码拆分提高网站性能 (Improve the Performance of your Site with Lazy-Load ...

  2. 如何加速 Web 应用程序并提高网站性能

    我们不需要提醒你快速网站加载的重要性.要么是 3 秒,要么是用户离开,因此你必须优化网站性能以符合用户的期望. 网站性能的优化是一件大事.它涉及多个方面需要照顾,其中许多取决于网站本身.其复杂性和元素 ...

  3. 利用 squid 反向代理提高网站性能

    本文在介绍 squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性.安全性方面有很好的用途.作者在具体的实验环境下,利用 DNS 轮询和 Squid 反向代理技术, ...

  4. 分享Web应用运行的细节问题:预编译提高网站性能、跟踪用户习惯和解决线程同步...

    在这个文章里,我将分享一下在iOpenWorks.com这个网站试运行中碰到的若干问题和解决方案,这些问题包含了:(1)如何通过ASP.NET MVC预编译提高性能:(2)如何知道网站在运行中,用户响 ...

  5. 提高网站性能的方法(学习笔记)

    1.缓存 对那些经常使用的数据和需要大量的时间来创建的数据可以存储在内存中,后来的请求直接使用,不需要在从新生成, 使用方法很简单: <%@OutputCache VaryByParams=&q ...

  6. html5不支持硬件加速,CSS开启硬件加速来提高网站性能-HTML5综合

    CSS开启硬件加速来提高网站性能-HTML5综合 本文由 文梅画史 于 2016-1-28 5:09 发布在 HTML5综合 在桌面端和移动端用CSS开启硬件加速 CSS animations, tr ...

  7. 海外租用主机如何提高网站性能和用户体验

    海外租用主机如何提高网站性能和用户体验 在全球化的今天,海外租用主机成为了许多企业和网站主人的选择,以便于提高网站性能和用户体验.租用海外主机的好处是可以让网站在国内外都有良好的访问速度和稳定性,还可 ...

  8. 使用CSS提高网站性能的30种方法

    根据httparchive.org的页面重量报告,CSS在平均70个请求和2MB的网页上占7个HTTP请求和70Kb的代码.这并不是网站性能糟糕的最坏原因(我正看着你呢,JavaScript),但CS ...

  9. 如何通过CSS开启硬件加速来提高网站性能

    你知道我们可以在浏览器中用css开启硬件加速,使GPU (Graphics Processing Unit) 发挥功能,从而提升性能吗? 现在大多数电脑的显卡都支持硬件加速.鉴于此,我们可以发挥GPU ...

最新文章

  1. fastbert解读
  2. keepalive 配合mysql主主复制
  3. windows下使用lighttpd+php(fastcgi)+mysql
  4. requests.exceptions.TooManyRedirects: Exceeded 30 redirects
  5. Boost:boost::callable_traits::function_type_t的测试程序
  6. 博客系统知多少:揭秘那些不为人知的学问(二)
  7. 前端学习(2746):uniapp--基本介绍
  8. 一文看懂网络上采样层中的 align_corners
  9. 三维点云学习(3)4-Expectation-Maximization (EM)
  10. Visual Assist X V10.4.1626.0 不错的软件,让VC++也能自动提示
  11. 《3ds Max疯狂设计学院》——1.7节学习3ds Max的基本流程,必须要在最开始就了解...
  12. CnPack实用功能推荐
  13. 1407 :上三角矩阵的判断(c语言)
  14. MP3播放(javazoom.jl.player.Player)
  15. java 社交网站_java学习之电影《社交网络》Facemash算法实现
  16. vue-baidu-map 百度地图(定位替换图标,添加标签)
  17. 权限控制-@Secured注解
  18. 20190118 阿耐---《艰难的制造》
  19. iOS 加粗字体方法 (不改变字体字号只加粗文字)
  20. 【跨域】Access-Control-Allow-Origin 简单介绍

热门文章

  1. python关键词提取源码,python实现textrank关键词提取
  2. SQLi LABS Less-5 报错注入+布尔盲注
  3. 学习Java必须避开的十大致命雷区,新手入门千万不要踩!
  4. F5补丁修复及几点命令
  5. QTP的那些事 -– Visual Relation Identifier Feature: How to use in the real world
  6. Acronis移动方案(三)
  7. 项目支持规划标准文档编写要点
  8. 关于快速创建空表的纠正
  9. LeetCode 5367. 最长快乐前缀
  10. ubuntu18 安装完怎么设置中文输入法?