javascript性能优化(2)

数据访问

四种基本数据类型:

1.直接量:仅是自身不存储于特定位置。包括:字符串、数字、布尔值、对象、数组、函数、正则表达式,具有特殊意义的空值,以及未定义。
2.变量:var 创建用于存储的数据值。
3.数组:具有数字索引,存储一个javascript数组对象。
4.对象:具有字符串索引,存储一个javascript对象。


函数运行过程中,每遇到一个变量,就对它进行搜索,查找同名的标识符。首先在作用域的最前端开始搜索,如果找到了,就使用这个具有标识符的变量;如果没有,就进入作用域的下一个对象;直到找到为止,或者没有更多的对象可以进行搜索,这种情况下,标识符被认为是未定义的。函数运行时,每个标识符都要进行这种搜索过程,正式这种搜索影响了性能

标识符识别性能

在函数运行的上下文作用域链中,一个标识符所处得位置越深,他的读写速度越慢。所以,局部变量访问是最快的,全局变量通常是最慢的

  1. with、try-catch:改变作用域链
    try {
      method();
    } catch (e) {
      handleError(e);
    }

当try发生错误时,程序自动进入catch,并将异常对象推入作用域链前端的一个可变对象中。在catch中,函数的所有局部变量现在被放在第二个作用域链的对象中。只要catch语句执行完成,作用域链就返回原来的状态。catch中只有一条语句如上handleError(e);没有局部变量的访问,作用域链临时改变就不会影响代码的性能。
2. 闭包

闭包与运行期上下文作用域链相同的对象引用,会造成内存泄露;

function assign() {
    var id="demo";
    document.getElementById("savebtn").onclick=function () {
        submitData();
    };
}

注意上面的代码:id和submitData,存在作用域链第一个对象之后的位置上。这里,你经常访问一些范围之外的标识符,每一次访问都会导致一些性能的损失。
将常用的域外变量存入局部变量之中,然后直接访问局部变量
3.访问对象比访问直接量或局部变量的速度慢,在某些浏览器上比访问数组还要慢。
4.原型 prototype

对象可以有两种类型的成员:实例成员和原形成员。实例成员直接作用于实例自身,而原形成员则从对象原形继承。

    var book={
        tit:"flower",
        pub:"China",
    };
    console.log(book.toString());    //[object Object]

上面代码中,book对象有两个实例成员,tit和pub。注意他并没有toString();这个方法。但是却被调用了,也没有报错,toString()函数就是一个book对象继承的原形成员。
book.toString()被调用时,对成员进行名为“toString()”的搜索,首先从对象实例开始,如果book没有名为toString()的成员,那么就转向搜索原形对象,在哪里发现了toString()方法,并执行他。通过这种方法book可以访问他的原形所拥有的每个属性和方法。
5.原型链
深入原型越深,搜索的速度就会越慢。
尽量避免多次读取同一个对象成员的值,可以存入局部变量来,提高性能。在嵌套成员中使用局部变量尤为重要。
将经常使用的对象成员,数组项,和域外变量存入局部变量中。然后,访问局部变量的速度会快于那些原始变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值