第二章 数据访问javascript
读书笔记:前端
JavaScript 中有四种基本数据访问位置: java
直接量:直接量仅仅表明本身,而不存储特定位置。字符串,数字,布尔,对象,数组,函数,正则表达式,具备特殊意义的空值,以及未定义。正则表达式
变量:var关键字建立用于存储数据值。编程
数组项:具备数字索引,存储一个javascript数组对象。数组
对象成员: 具备字符串索引,存储一个javascript对象。浏览器
总的来讲, 直接量和局部变量的访问速度要快于数组项和对象成员的访问速度。函数
管理做用域性能
每一个javascript函数都被表示为对象,进一步说,是一个函数实例。优化
函数对象正如其余对象同样,拥有你能够编程访问的属性,和一系列不能被程序访问,仅供javascript引擎使用的内部属性。其中一个属性是[scope]做用域。
内部[scope]属性包含一个函数被建立的做用域中的对象的集合。此集合被称为函数的做用域链。它决定哪些数据可由函数访问,此函数做用域链中的每一个对象称为一个可变对象,每一个可变对象都以“键值”的形式存在。当一个函数建立后,他的做用域链被填充以对象,这些对象表明建立此函数的数据。
在函数运行过程当中,每遇到一个变量,标识符识别过程要决定从哪里得到或者存储数据。
此过程搜索运行期上下文的做用域链,查找同名的标识符。从运行函数的激活目标之做用域的前端开始,若是找到了,就使用这个具备指定标识符的变量。 若是没找到,继续搜索,知道标识符被找到。 函数运行时每一个标识符都会通过这样的过程,这种搜索过程会影响性能。
在运行期的上下文的做用域链中,一个标识符所处的位置越深,读写速度越慢,因此,局部变量的读写速度是最快的,全局变量一般是最慢的。
在没有优化Javascript引擎的浏览器中,尽量使用局部变量。
用局部变量存储本地范围以外的变量值,若是它在函数中的使用多于一次。
改变做用域链
通常来讲, 一个运行期上下文的做用域链不会改变。可是,有两种表达式能够改变上下文做用域链。
1.With
With(document)建立一个默认操做变量
经过将document对象传递给with表达式,一个新的可变对象容纳了document对象的全部属性。被插入到了做用域的前端。访问document属性很是快,但访问局部变量的速度变慢了,最好不要使用with。正如前面提到的,只要简单的将document存储到局部变量中,就能够得到性能上的提高。
总结:
在javascript中, 数据存储位置能够对代码总体性能产生重要影响。有四种数据访问类型,直接量,数组项,对象成员, 他们有着不一样的性能考虑。
直接量和局部变量访问速度很是快, 数组项和对象成员须要更长时间。
局部变量比域外变量快,由于它位于做用域链的第一个对象中。变量在做用域中的位置越深,访问所需的时间就越长,所有变量老是最慢的,由于他们老是位于做用域链的最后一环。
避免使用with表达式,由于它改变了运行期上下文的做用域链,并且应当当心对待try-catch表达式的catch子句,由于它具备一样效果。
嵌套对象会形成重大性能影响,尽可能少用。
一个属性或方法在原型链中的位置越深,访问它的速度就越慢。
提升javascript的性能,将常用的对象成员,数组项,和域外变量存入局部变量中,而后,访问局部变量的速度就快于那些原始变量。