高性能JavaScript之数据存取

JS中有两条链。一个是作用域链,一个是原型链。

而数据存储有四种方式: 字面量,变量,数组项,对象成员。

作用域链

1.访问字面量和局部变量的速度最快,访问数组元素和对象成员相对较慢。字面量和变量都是直接拿到值,但是数组和对象这种引用数据类型,是拿到地址,在去地址查询值,过程复杂一点,就慢了。

2.由于局部变量存在于作用域链的起始位置,因此访问局部变量比访问跨作用于变量更快。变量在作用域链中位置越深,访问所需时间就越长,因此全局作用域的访问速度最慢。
就像–函数执行的时候是沿着作用域链,一层一层查询的,只有当前层没有,才去上层查询。当然越向上层,查询就越慢。
如何解决这个问题呢:一个常用的方法就是在局部作用域将上层的变量缓存一下。

for(let i=0;i<arr.length;i++){
    const cur = arr[i]  //这里就是在局部作用域把外层的变量缓存一下
    ///...
  }

3.避免使用with语句,因为with关键字会改变执行环境的作用域链,类似的还有eval,这两个关键字是尽量避免使用的,因为他们影响作用域,导致作用域的重新计算,这是很影响性能的。

原型链

1.嵌套的对象成员会明显影响性能
在这里插入图片描述
这一段代码中YAHOO.util.Dom是一个层级比较深,又多次应用的数据,我们完全可以建立一个新的引用,指向他,操作他。
在这里插入图片描述

2.属性或方法在原型链的位置越深,访问它的速度越慢:这点和作用域链一样,要一层层查找,避免这种情况的方式,同样是建立新的引用关系
3. 通常来说,把常用的对象成员,数组元素,跨域变量保存在局部变量中,多JS性能是有改善的。其中的跨作用域变量,也就是闭包中保存起来的变量了。使用闭包对内存的开销大,容易引起内存泄漏等问题,采用局部变量缓存一下,就可以达到同样的效果,可以避免闭包带来的问题

猜你喜欢

转载自blog.csdn.net/weixin_40121676/article/details/109521027