
正文
高性能js之数据访问性能
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
js中si中基本数据访问:
直接量, 变量, 数组项, 对象成员
性能问题:
首先要理解作用域链的基本概念,例如,当一个函数被创建时,就会产生一个激活对象(AO对象),AO对象中存储了该函数中所有的属性和值。当然对应的全局对象也会存在一个作用域,新创建的作用域位于全局对象作用域的顶部,形成类似链子一样的作用域链,当访问函数中某个属性时,从作用域链的顶部开始查找是否有该属性,若有则直接用之,若没有,则继续作用域链的下一个对象,直到找到为止,若在作用域链中不存在该属性,则返回undefined。
还有一个是原型链,原型链就是一个构造函数的祖先,构造函数创建的实例对象有自己的独特属性,还共同拥有者从原型继承而来的公共属性。而原型也是一个对象,原型的原型就Object(),这就形成一个原型链,访问对象的某个属性时,先看构造函数是否有该属性,若有则用之,若没有,则看构造函数的原型是否有该属性,然后原型的原型,知道最后的Object(),若都没有,则返回undefined
1.访问直接量和变量比访问数组项和对象属性速度要快,所有尽量少的访问数组和对象(注意:这不是说不让访问,而是对同一个数组项或对象属性不要重复访问,可以将第一次访问结果存储到局部变量中fang,下次直接访问局部变量)
2.作用域链和原型链,访问的属性位于作用域链或原型链层次越深,访问之所需时间就越多,即速度就越慢,同理,将第一次访问结果存储到局部变量中,下次直接访问局部变量即可。
3.with可以更改作用域链顶部对象,导致其他对象作用域降低一级,所以with能不用就别用。
4.try{}catch(e){...},在catch中也会改变作用域链,将异常对象作为作用域链的顶部,导致其他作用域的变量访问变慢(注意:只要catch子句执行完毕,作用域链就会返回之前状态),但catch在很多地方还是很有用的,所以可以将异常对象作为参数参数处理函数,这样只有一条语句,没有局部访问,作用域链被改就不会影响代码性能。
5.闭包:当在一个函数内形成闭包,导致两个问题,首先,闭包中包含该函数的应用导致该函数无法被销毁,结果就是内存泄漏.此为内存问题。然后,闭包被执行时,闭包作用域称为作用域链第一作用域,每次闭包访问该函数内的属性时就会产生一些性能损失。
6.对象成员嵌套:对象成员中还可以包含成员,例如:window.location.href , 这种访问,每多一个点间隔,访问层次就越深,所需事件就越多,速度就越慢,所以最好将第一次访问结果存储到一个局部变量中,下次访问直接访问局部变量即可。消除了重复访问同一属性的性能问题。数组类似。
基本目的:
尽量以最快的速度访问到数据;
解决基本原理 :
用局部变量存储第一次访问结果,下次访问直接访问局部变量,提高访问速度性能。







