有效提高JavaScript执行效率的几点知识

 更新时间:2015年01月31日 11:30:31   转载 投稿:junjie  
这篇文章主要介绍了有效提高JavaScript执行效率的几点知识,本文从JavaScript函数、JavaScript作用域、JavaScript字符串、JavaScript DOM操作、DOM重绘、DOM访问、DOM遍历等方面讲解了提高JavaScript执行效率的小技巧,需要的朋友可以参考下

为了提供新鲜、别致的用户体验,很多网站都会使用 JavaScript 来改善设计、验证表单、检查浏览器,以及Ajax请求,cookie操作等等,实现无刷新动态效果 。但是,要将大量内容在浏览器呈现,如果处理不好,网站性能将会急剧下降。所以我们有必要了解下,如何提高JavaScript的执行效率。

JavaScript 函数

在JavaScript 中,函数在使用前会预编译。尽管有些时候下可以使用字符串代替函数,但是每次执行这段JavaScript 代码时都会重新解析,影响性能。

1、eval例子

复制代码 代码如下:

eval('output=(input * input)');
// 建议改成:
eval(new function() { output=(input * input)});

2、setTimeout例子

复制代码 代码如下:

setTimeout("alert(1)", 1000);
// 建议改成:
setTimeout(function(){alert(1)}, 1000);

使用函数代替字符串作参数确保新方法中的代码能被 JavaScript 编译器优化。

JavaScript作用域

JavaScript作用域链中的每个作用域都包含几个变量。理解作用域链很重要,这样才能利用它。

复制代码 代码如下:

var localVar = "global"; //全局变量

function test() {

  var localVar = "local"; //局部变量

  //局部变量
  alert(localVar);

  //全局变量
  alert(this.localVar);

  //查找document在局部变量找不到,就查找全局变量
  var pageName = document.getElementById("pageName");
}

使用局部变量比使用全局变量快得多,因为在作用域链中越远,解析越慢。下图显示了作用域链结构:

如果代码中有 with 或 try-catch 语句,作用域链会更复杂,如下图:

JavaScript字符串

JavaScript中一个非常影响性能的函数是字符串连接,一般情况都是使用 + 号来实现拼接字符串。但是早期浏览器没有对这样的连接方式做优化,导致在连续创建和销毁字符串严重降低JavaScript执行效率。

复制代码 代码如下:

var txt = "hello" + " " + "world";

建议改成:

复制代码 代码如下:

var o = [];
o.push("hello");
o.push(" ");
o.push("world");
var txt = o.join();

我们再简单封装一下:

复制代码 代码如下:

function StringBuffer(str) {
    var arr = [];
    arr.push(str || "");
    this.append = function(str) {
        arr.push(str);
        return this;
    };
    this.toString = function() {
        return arr.join("");
    };
};

然后这样子调用:

复制代码 代码如下:

var txt = new StringBuffer();
txt.append("Hello");
txt.append(" ");
txt.append("World");
alert(txt.toString());

JavaScript DOM操作

HTML Document Object Model (DOM) 定义了访问和操作 HTML 文档的标准方法。它将 HTML 文档表示成节点树,其中包含元素、属性和文本内容。通过使用 HTML DOM,JavaScript 能访问 HTML 文档中所有节点并操作它们。

DOM重绘

每次修改到页面的DOM对象,都涉及到DOM重绘,浏览器都会重新渲染页面。所以降低DOM对象的修改次数,可以有效地提高JavaScript 的性能。

复制代码 代码如下:

for (var i = 0; i < 1000; i++ ) {
  var elmt = document.createElement('p');
  elmt.innerHTML = i;
  document.body.appendChild(elmt);
}

建议改成:

复制代码 代码如下:

var html = [];
for (var i = 0; i < 1000; i++) {
  html.push('<p>' + i + '</p>');
}
document.body.innerHTML = html.join('');

DOM访问

通过DOM可以访问到HTML文档中的每个节点。每次调用getElementById()、getElementsByTagName()等方法,都会重新查找并访问节点。所以将查找到的DOM节点缓存一下,也可以提高JavaScript 的性能。

复制代码 代码如下:

document.getElementById("p2").style.color = "blue";
document.getElementById("p2").style.fontFamily = "Arial";
document.getElementById("p2").style.fontSize = "larger";

建议改成:

复制代码 代码如下:

var elmt = document.getElementById("p2");
elmt.style.color = "blue";
elmt.style.fontFamily = "Arial";
elmt.style.fontSize = "larger";

DOM遍历

DOM遍历子元素通常都是按索引循环读取下一个子元素,在早期浏览器下这种读取方式执行效率很低,利用nextSibling方式可以提高js遍历DOM的效率。

复制代码 代码如下:

var html = [];
var x = document.getElementsByTagName("p");//所有节点
for (var i = 0; i < x.length; i++)  {
  //todo
}

建议改成:

复制代码 代码如下:

var html = [];
var x = document.getElementById("div");//上级节点
var node = x.firstChild;
while(node != null){
  //todo
  node = node.nextSibling;
}

JavaScript 内存释放

在web应用中,随着DOM对象数量的增加,内存消耗会越来越大。所以应当及时释放对象的引用,让浏览器能够回收这些内存。

释放DOM占用的内存

复制代码 代码如下:

document.getElementById("test").innerHTML = "";

将DOM元素的innerHTML设置为空字符串,可以释放其子元素占用的内存。

释放javascript对象

复制代码 代码如下:

//对象:
obj = null
//对象属性:
delete obj.property
//数组元素:
arr.splice(0,3);//删除前3个元素

相关文章

  • 页面使用密码保护代码

    页面使用密码保护代码

    这是一个由JS实现的网页密码保护代码,在进入网页前需要在弹出框中输入密码才可以,不过现在不怎么用了,一般情况下,目前都在后台处理这种功能,用户输入用户名和密码后交给服务器处理,然后再返回信息,若登录无误就可看到某些内容
    2013-04-04
  • JS中产生20位随机数以0-9为例也可以是a-z A-Z

    JS中产生20位随机数以0-9为例也可以是a-z A-Z

    本节主要介绍了JS如何产生随机数,本例产生20位随机数以0-9为例也可以是a-z A-Z,需要的朋友可以参考下
    2014-08-08
  • JS与HTML结合实现流程进度展示条思路详解

    JS与HTML结合实现流程进度展示条思路详解

    基于js与html相结合实现的流程进度展示条,非常实用,在各大网站都可以用到,下面小编给大家带来了JS与HTML结合实现流程进度展示条思路详解,需要的朋友参考下吧
    2017-09-09
  • Window.Open如何在同一个标签页打开

    Window.Open如何在同一个标签页打开

    这篇文章主要介绍了Window.Open如何在同一个标签页打开,需要的朋友可以参考下
    2014-06-06
  • JavaScript 身份证号有效验证详解及实例代码

    JavaScript 身份证号有效验证详解及实例代码

    这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下
    2016-10-10
  • JS立即执行的匿名函数用法分析

    JS立即执行的匿名函数用法分析

    这篇文章主要介绍了JS立即执行的匿名函数,结合实例形式分析了;(function() {})();相关原理、使用技巧及操作注意事项,需要的朋友可以参考下
    2019-11-11
  • 在JavaScript中使用JSON数据

    在JavaScript中使用JSON数据

    JSON 是 JavaScript 原生格式,这意味着 在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包,接下来由脚本之家小编给大家介绍在JavaScript中使用JSON数据的方法,感兴趣的朋友一起学习吧
    2016-02-02
  • js使用eval解析json实例与注意事项分享

    js使用eval解析json实例与注意事项分享

    eval函数在js中有不少用处了,下面我来给各位朋友介绍eval解析json的实例,基于这个实例我们引出来在eval处理json数据时的一些注意事项,希望文章对各位同学会有所帮助
    2014-01-01
  • 微信小程序动态显示项目倒计时

    微信小程序动态显示项目倒计时

    这篇文章主要为大家详细介绍了微信小程序动态显示项目倒计时,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • js设置document.domain实现跨域的注意点分析

    js设置document.domain实现跨域的注意点分析

    这篇文章主要介绍了js设置document.domain实现跨域的注意点,较为详细的分析了document.domain跨域的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论