JS教程-JavaScript最佳实践性能.docxVIP

  • 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

文档评论(0)

1亿VIP精品文档

相关文档