轻松实现代码精简!揭秘高效JS代码优化技巧(图文并茂教程)
关于如何提升你的JavaScript代码(图文教程)
JavaScript代码的执行速度往往直接关联到网页的性能,有时,即便实现相同的功能,不同的JavaScript代码在效率上也可能存在很大差异。有时这种差异仅仅是因为我们的编写习惯所导致。当然,在较高级的浏览器中,它们大多已经为我们进行了优化。但在我国,令人痛恨的IE6仍然广泛存在,我们不得不加以考虑。对于JavaScript代码的优化,实际上存在许多情况,有些影响较小,而有些则较为严重。本文中,我将列举几个我认为影响较为严重的情况,供大家参考。
1、字符串的连接
字符串连接在我们的开发中时常遇到,因此我将其放在首位。我们通常习惯直接使用+=的方式来进行字符串连接,但实际上这种连接方式效率非常低。我们可以采用一种巧妙的方法来实现字符串连接,那就是利用数组的join方法。
//效率低的 function func1(){
var start= new Date().getTime();
var template="";
for(var i= 0; i< 10000; i++){
template+="";
}
var end= new Date().getTime();
document.getElementById("one").innerHTML= template;
alert("用时:"+(end- start)+"毫秒");
}
//效率高的 function func2(){
var start= new Date().getTime();
var array= [];
for(var i= 0; i< 10000; i++){
array[i]="";
}
var end= new Date().getTime();
document.getElementById("one").innerHTML= array.join("");
alert("用时:"+(end- start)+"毫秒");
}
我们来看看其在不同浏览器下的执行情况。
我们会发现,在IE6下其差异相当明显,实际上这种情况在IE的高版本中也十分明显,但在Firefox下却没有多大的区别,相反第二种方法的相对效率还要低一些,不过仅相差2ms左右,而Chrome也和Firefox类似。另外,在这里顺便说明一下,在我们向数组添加元素时,很多人喜欢使用数组的原生方法push,实际上直接使用arr[i]或arr[arr.length]的方式要快一些,大约在10000次循环的情况下,IE浏览器下会有十几毫秒的差距。
2、for循环
for循环是我们经常会遇到的情况,我们先看看下面的例子:
var arr= [];
for(var i= 0; i< 10000; i++){
arr[i]="
"+ i+"
";
}
document.body.innerHTML+= arr.join("");
//效率低的 function func1(){
var ps= document.getElementsByTagName("p");
var start= new Date().getTime();
for(var i= 0; i< ps.length; i++){
//"效率低"
}
var end= new Date().getTime();
alert("用时:"+(end- start)+"毫秒");
}
//效率高的 function func2(){
var ps= document.getElementsByTagName("p");
var start= new Date().getTime();
for(var i= 0, len= ps.length; i< len; i++){
//"效率高"
}
var end= new Date().getTime();
alert("用时:"+(end- start)+"毫秒");
}
从上表可以看出,在IE6.0下,其差异非常明显,而在Firefox和Chrome下几乎没有差异。之所以在IE6.0下会有这种情况,主要是因为for循环在执行过程中,第一种情况会每次都计算一下长度,而第二种情况却是在开始时计算长度,并将其保存到一个变量中,因此其执行效率要高一些。因此,在我们使用for循环时,特别是需要计算长度的情况下,我们应该将其保存到一个变量中。但是,并不是所有取长度的情况都会出现如此明显的差异。如果我们仅仅操作一个数组,取得的只是一个数组的长度,那么这两种写法的差异其实并不大。我们看下面的例子:
var arr2= [];
for(var i= 0; i< 10000; i++){
arr2[i]="
"+ i+"
";
}
//效率低的 function func1(){
var start= new Date().getTime();
for(var i= 0; i< arr2.length; i++){
//"效率低"
}
var end= new Date().getTime();
alert("用时:"+(end- start)+"毫秒");
}
//效率高的 function func2(){
var start= new Date().getTime();
for(var i= 0, len= arr2.length; i< len; i++){
//"效率高"
}
var end= new Date().getTime();
alert("用时:"+(end- start)+"毫秒");
}
从上表可以看出,如果仅仅是一个数组的话,我们看到其实两种写法都是差不多的。实际上,如果我们把循环次数提高到100000次,也仅仅是差异几毫秒而已。因此,我认为在数组的情况下,这两种写法都是一样的。对于for循环的优化,也有人提出很多观点,有人认为使用-=1或从大到小的方式循环等,我认为这些都是完全没有必要的。这些优化在实际情况下往往没有明显表现,换句话说,只是计算机级别的微小变化,但会大大降低代码的可读性,因此实在是得不偿失。
3、降低页面重绘
降低页面重绘虽然本质不是JavaScript本身的优化,但往往是由JavaScript引起的,而重绘的情况往往会严重影响页面性能,因此有必要单独拿出来讨论。我们看下面的例子:
降低页面重绘虽然并非JavaScript本身优化的核心,但往往是由其引发的。页面重绘往往严重影响了页面性能,因此有必要对其进行探讨。以下是一个示例:
```html
var str="
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
这是一个测试字符串
";
//效率低的 function func1(){
var obj= document.getElementById("demo");
var start= new Date().getTime();
for(var i= 0; i< 100; i++){
obj.innerHTML+= str+ i;
}
var end= new Date().getTime();
alert("用时"+(end- start)+"毫秒");
}
//效率高的 function func2(){
var obj= document.getElementById("demo");
var start= new Date().getTime();
var arr= [];
for(var i= 0; i< 100; i++){
arr[i]= str+ i;
}
obj.innerHTML= arr.join("");
var end= new Date().getTime();
alert("用时"+(end- start)+"毫秒");
}
```
结果显示,仅100次循环,无论在何种浏览器下,都出现了显著的性能差异。此外,我们还发现IE6的执行效率甚至优于Firefox,这说明Firefox在页面重绘方面并未进行相应的优化。需要注意的是,影响页面重绘的不仅仅是innerHTML
,改变元素的样式、位置等也会触发页面重绘,因此在日常开发中要特别注意这一点。
4、减少作用域链上的查找次数
我们知道,在JavaScript代码执行过程中,访问变量或函数时,需要遍历当前执行环境的作用域链。遍历顺序是从作用域链前端开始,逐级向后,直至全局执行环境。因此,如果频繁访问全局环境变量对象,每次都需要在当前作用域链上逐级查找,这显然会消耗较多时间。以下是一个示例:
```html
function func1(){
var start= new Date().getTime();
for(var i= 0; i< 10000; i++){
var but1= document.getElementById("but1");
var but2= document.getElementById("but2");
var inputs= document.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
var but1= document.getElementById("but1");
var but2= document.getElementById("but2");
var inputs= document.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
var but1= document.getElementById("but1");
var but2= document.getElementById("but2");
var inputs= document.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
var but1= document.getElementById("but1");
var but2= document.getElementById("but2");
var inputs= document.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
var but1= document.getElementById("but1");
var but2= document.getElementById("but2");
var inputs= document.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
var but1= document.getElementById("but1");
var but2= document.getElementById("but2");
var inputs= document.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
}
var end= new Date().getTime();
alert("用时"+(end- start)+"毫秒");
}
function func2(){
var start= new Date().getTime();
var doc= document;
for(var i= 0; i< 10000; i++){
var but1= doc.getElementById("but1");
var but2= doc.getElementById("but2");
var inputs= doc.getElementsByTagName("input");
var ps= doc.getElementsByTagName("p");
var but1= doc.getElementById("but1");
var but2= doc.getElementById("but2");
var inputs= doc.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
var but1= doc.getElementById("but1");
var but2= doc.getElementById("but2");
var inputs= doc.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
var but1= doc.getElementById("but1");
var but2= doc.getElementById("but2");
var inputs= doc.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
var but1= doc.getElementById("but1");
var but2= doc.getElementById("but2");
var inputs= doc.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
var but1= doc.getElementById("but1");
var but2= doc.getElementById("but2");
var inputs= doc.getElementsByTagName("input");
var ps= document.getElementsByTagName("p");
}
var end= new Date().getTime();
alert("用时"+(end- start)+"毫秒");
}
```
var elementsP = document.getElementsByTagName("p");
var button1 = document.getElementById("but1");
var button2 = document.getElementById("but2");
var inputElements = document.getElementsByTagName("input");
var elementsP = document.getElementsByTagName("p");
}
var finalTime = new Date().getTime();
alert("耗时"+(finalTime- startTime)+"毫秒");在上述代码中,第二种处理方式是先将全局变量的值存储在函数内部,然后直接引用这些变量,而第一种处理方式则是每次都沿着作用域链遍历,直至全局环境。我们发现第二种处理方式实际上只遍历了一次,而第一种处理方式却是每次都遍历,因此我们来看看它们的执行结果:
从下表中可以看出,在IE6下这种差异非常明显,而且这种差异在多层作用域链和多个全局变量的情况下会更加显著。
5、防止重复解析
重复解析的情况也是我们经常遇到的,有时我们没有考虑到这种情况会影响效率。重复解析通常出现在我们使用eval、new Function和setTimeout等函数时,下面我们看看一个例子:
var total, number
SEO优化教程
1.每个网页标题简洁明了,不宜过长,确保访问者一眼就能了解你网站的目的。网页标题最好不超过25个字。
2.每个网页核心关键词不超过4个。
3.最重要的关键词应置于标题首位,依次递减。最核心的关键词应尽早出现。
4.网站描述应简洁明了,关键词应自然地出现在开头和结尾部分。
5.网站导航应采用文字导航。
6.网站图片应原创,并添加alt标签,切勿随意添加。搜索引擎可以理解图片。
7.将与主题无关的内容制作成JS或图片。
8.网站内容应简洁,信息丰富。关键词应合理分布,自然。
9.网站联系人信息应原创,如邮箱、电话、姓名等。
10.网站代码应简洁,使网站文件最小化,这不仅可以加快网页加载速度,也有利于搜索引擎爬虫的抓取。
11.与主题相关的JS、框架应进行兼容性优化。
12.网站设计应大方美观,坚持使用div+CSS布局。
13.网站域名应选择使用时间超过1年以上的,最好是未曾被惩罚过的。
14.域名最好包含最核心关键词,针对除百度以外的搜索引擎有效。
15.如果新域名,联系人信息必须公布,且为新信息。
16.空间应稳定,那种经常打不开的网站,肯定没有排名。
17.友情链接应寻找外地的网站。
18.友情链接不关注PR,关注快照、核心关键词排名、首页是否存在。
19.网站外链应丰富,包括新闻类、行业类、生活类、公关类等,越丰富越好。
20.网站外链不在数量,而在于质量。增加外链应掌握好节奏。
21.网站外链应包含网址,占比70%,锚文本应适当。
22.网站外链应首先提高首页权重,首页快照在7天内,核心关键词在前3页,则网站权重合格。
23.网站外链应出现在流行度较高的地方。
24.网站外链出现的地方,切勿出现垃圾链接,链接过多。
25.网站应添加流量统计,大致数据应公开。
26.适当增加网站IP和来路,切勿让网站流量仅来自某一个搜索引擎。
27.网站内容应围绕主题展开,切勿发布无关内容。
28.网站应添加XML和HTML格式地图,有助于各大搜索引擎收录抓取。
29.网站应按规律更新,切勿长时间不更新或一次性更新过多。
30.合理分布网站内链接,核心关键词应指向核心关键词页面。
31.网页内容中出现关键词加粗效果并不好,避免全加粗加链接。
32.每个页面最好出现一次H标签,内容与网友标题一致。
33.制作网站404页面。
34.与主题无关的页面,运用Robots.txt禁止。
35.制作网站主题相关的PDF、doc、exe等文档和软件提供下载,在这些资源上写上自己的网站。
36.网站最开始的内容,最好一次性完成,切勿收录后频繁更改。
37.网站页面切勿频繁更改主题和关键词密度,95%被K的原因都是这个。
38.网站外链切勿使用同一个账号、同一个名字发布,如博客、论坛等。
39.完成这些工作后,需要等待!一边持续更新,一边维持,添加外链和内链。
40.保持正常更新,直到网站排名出现。
共有 0 条评论