- 2
- 0
- 约6.73千字
- 约 11页
- 2017-10-22 发布于北京
- 举报
JS教程-JavaScript最佳实践性能
JS教程-JavaScript最佳实践:性能
注意作用域
避免全局查找
一个例子:
function updateUI(){
var imgs = document.getElementByTagName(img);
for(var i=0, len=imgs.length; i
imgs[i].title = document.title + image + i;
}
var msg = document.getElementById(msg);
msg.innnerHTML = Update complete.;
}
该函数可能看上去完全正常,但是它包含了三个对于全局document对象的引用。如果在页面上有多个图片,那么for循环中的document引用就会被执行多次甚至上百次,每次都会要进行作用域链查找。通过创建一个指向document对象的局部变量,就可以通过限制一次全局查找来改进这个函数的性能:
function updateUI(){
var doc = document;
var imgs = doc.getElementByTagName(img);
for(var i=0, len=imgs.length; i
imgs[i].title = doc.title + image + i;
}
var msg = doc.getElementById(msg);
msg.innnerHTML = Update complete.;
}
这里,首先将document对象存在本地的doc变量中;然后在余下的代码中替换原来的document。与原来的版本相比,现在的函数只有一次全局查找,肯定更快。
选择正确方法
1.避免不必要的属性查找
获取常量值是非常高效的过程
var value = 5;
var sum = 10 + value;
alert(sum);
该代码进行了四次常量值查找:数字5,变量value,数字10和变量sum。
在JavaScript中访问数组元素和简单的变量查找效率一样。所以以下代码和前面的例子效率一样:
var value = [5,10];
var sum = value[0] + value[1];
alert(sum);
对象上的任何属性查找都比访问变量或者数组花费更长时间,因为必须在原型链中对拥有该名称的属性进行一次搜素。属性查找越多,执行时间就越长。
var values = {first: 5, second: 10};
var sum = values.first + values.second;
alert(sum);
这段代码使用两次属性查找来计算sum的值。进行一两次属性查找并不会导致显著的性能问题,但是进行成百上千次则肯定会减慢执行速度。
注意获取单个值的多重属性查找。例如:
var query = window.location.href.substring(window.location.href.indexOf(?));
在这段代码中,有6次属性查找:window.location.href.substring()有3次,window.location.href.indexOf()又有3次。只要数一数代码中的点的数量,就可以确定查找的次数了。这段代码由于两次用到了window.location.href,同样的查找进行了两次,因此效率特别不好。
一旦多次用到对象属性,应该将其存储在局部变量中。之前的代码可以如下重写:
var url = window.locaiton.href;
var query = url.substring(url.indexOf(?));
这个版本的代码只有4次属性查找,相对于原始版本节省了33%。
一般来讲,只要能减少算法的复杂度,就要尽可能减少。尽可能多地使用局部变量将属性查找替换为值查找,进一步奖,如果即可以用数字化的数组位置进行访问,也可以使用命名属性(诸如NodeList对象),那么使用数字位置。
2.优化循环
一个循环的基本优化步骤如下所示。
(1)减值迭代——大多数循环使用一个从0开始、增加到某个特定值的迭代器。在很多情况下,从最大值开始,在循环中不断减值的迭代器更加高效。
(2)简化终止条件——由于每次循环过程都会计算终止条件,所以必须保证它尽可能快。也就是说避免属性查找或其他操作。
(3)简化循环体——循环是执行最多的,所以要确保其最大限度地优化,确保其他某些可以被很容易移除循环的密集计算。
(4使用后测试循环——最常用for循环和while循环都是前测试循环。而如do-while这种后测试循环,可以避免最初终止条件的计算,因此运行更快。
以下是一个基本的for循环:
for(var i=0; i valu
您可能关注的文档
- EPLAN中的符号元件部件与设备.docx
- Eqaaslu学日语记单词简单有规律.doc
- equals(Object)与的区别.doc
- ERP实施与维护实训指导书.doc
- EDA数字逻辑三人表决器.doc
- ERPMRPMRPⅡ的区别与联系.doc
- ERP创业之星局域网连入方法win7版.doc
- Excel2010工作表中插入分类汇总的嵌套级别的方法.docx
- ExcelVBAActivecell用法.doc
- Excel一次隐藏所有空列.doc
- GB/T 42818.2-2026认知无障碍 第2部分:报告.pdf
- 中国国家标准 GB/T 47116-2026地下采矿机械 工作面移动式采掘机械 采煤机和犁式系统的安全要求.pdf
- 《GB/T 47116-2026地下采矿机械 工作面移动式采掘机械 采煤机和犁式系统的安全要求》.pdf
- 中国国家标准 GB/T 42818.2-2026认知无障碍 第2部分:报告.pdf
- 《GB/T 42818.2-2026认知无障碍 第2部分:报告》.pdf
- 《GB/T 27664.1-2026无损检测仪器 超声检测设备的性能与检验 第1部分:仪器》.pdf
- 中国国家标准 GB/T 27664.1-2026无损检测仪器 超声检测设备的性能与检验 第1部分:仪器.pdf
- GB/T 27664.1-2026无损检测仪器 超声检测设备的性能与检验 第1部分:仪器.pdf
- GB/T 45305.5-2026声学 建筑构件隔声的实验室测量 第5部分:测试设施和设备的要求.pdf
- 中国国家标准 GB/T 45305.5-2026声学 建筑构件隔声的实验室测量 第5部分:测试设施和设备的要求.pdf
原创力文档

文档评论(0)