第二章 数据访问

第二章 数据访问

数据存储的位置关系到代码运行时,被检索的速度。

1. JavaScript中的数据存储
1. 直接量: 代表自身,不存储在任何位置。字符串,数字,布尔值,数组,对象,undifined,null等等。
2. 变量:使用var来存储的数据值。
3. 数组项:具有数字索引,存储javascript数组对象。
4. 对象成员:具有字符串索引,存储javascript对象。

访问直接量和局部变量的速度差不多,要优于数组项和成员对象。

这里写图片描述

例外:firefox3优化过的数组项访问速度非常快。

2.变量和标识符

变量:javascript中的变量是松散类型的,可以保存任何类型的数据。由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变

标识符:变量的名字

标识符解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级地向后回溯,直到找到标识符为止。

每个运行上下文都有自己的作用域链用来解析标识符,当运行上下文被创建时,该作用域链被初始化,之前得[scope]复制进作用链最底层,同时会创建一个名叫’激活对象’的可变对象,他包含局部变量,参数,以及this指针。被压入作用域链顶层。

3.管理作用域

2.1作用域链和标识符解析

javascipt中任何数据类型都可以称之为对象,那么函数也不例外。
//原型链的最顶层是object,
//构造函数的最顶层是Function。
那么函数也具有可以编程使用的属性,和一些javascript引擎提供的内置属性。其中一个就是[scope]

scope属性
内部[scope]包含了一个函数被创建时作用域对象的集合。这些对象的集合被称作作用域链。函数作用域链中的每个对象被称为可变对象。可变对象是以键值对的形式存在。当函数被访问时会创建一个可供函数作用域访问的数据对象。

例如下面这个全局函数:

function Add(num1,num2){
    var sum = num1 + num2;
    return sum;
}

被创建时作用域如下图所示:

这里写图片描述

当add函数被创建时,首先会在作用域链中注入一个全局对象,该对象包含所有全局作用域中的变量,例如窗口浏览器,this指针,全局变量等。

当函数被执行时

Add(1,2)
当函数被运行时,会创建一个“运行期上下文”,该上下文定义了函数运行期的环境,该运行期上下文是独一无二的。每次执行函数都会创建一个运行期上下文,导致反复执行,当函数执行完成,该运行期上下文被销毁。

这里写图片描述

当函数运行时,每遇到一个变量,会搜索运行期上下文,沿着作用于链一个对象一个对象向下搜索,先搜索’激活对象’,如果搜索到了,就是用标识符匹配这个变量。否则往下搜索直到全局对象,如果还未找到。就会返回null,或者报错。

总结:

  • 在javascript中,数据储存的位置 对代码整体性能的影响十分的重要,共有四种数据类型:直接量,变量,数组项,对象成员。
  • 直接量和局部变量访问的速度最快,数组项和对象成员可能需要更长的时间。
  • 避免使用with表达式,因为它改变了运行期上下文的作用域链。
  • 嵌套对象成员会对性能有重大的影响所以尽量少用
  • 提升javascript的方法:将经常使用的数组项,全局变量,对象成员引入函数,使之成为局部变量。然后引用局部变量的速度会远远高于原始变量
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章