1. js四种基本的数据存储位置:
1) 直接量: 只代表本身,不存储在特定位置(字符串, 数字, 布尔值, 对象, 数组, 函数, 正则表达式, null, undifined)
2) 变量: 用关键字var定义的数据存储单元
3) 数组元素: 存储在js数组对象内部, 以数字作为索引.
4) 对象成员: 存储在js数组对象内部, 以字符串作为索引.
性能方面取决于浏览器分别对这四种数据存储位置进行200000次操作所用的时间. 直接量和局部变量的访问速度快于数组项和对象成员的访问速度
2. 管理作用域(比如确定那些变量可以被函数访问, 确定this的赋值)
1) 作用域链和标识符解析
内部属性[Scope]:包含了一个函数被创建的作用域中对象的集合. 这个集合被称为函数的作用域链,决定了那些数据能被函数访问.
执行函数时会创建一个成为‘运行上下文‘的内部对象, 每个运行期上下文都有自己的作用域链,用于标识符解析.
2) 标识符解析的性能
一个标识符所在的位置越深,它的读写速度就越慢.函数中读写局部变量是最快的,读写全局变量(总是处于运行期上下文作用域链的最末端)是最慢的(Chrome和Safari 4 不会出现这种问题).
跨作用域的值(如document)在函数中被引用一次以上, 那么就把它存储到局部变量里.
3) 改变作用域链
with语句用来给对象的所有属性创建一个变量. (实际功能用来避免书写重复代码),但是访问布局变量变慢了
try-catch,在catch代码块内部,函数所有局部变量将会放在第二个作用域链对象中.但他不是用来解决js错误的.
4) 动态作用域(只有确实有必要时再用)
with
try-catch
eval()函数,可计算某个字符串,并执行其中的的 JavaScript 代码。
5) 闭包, 作用域和内存
闭包: 允许函数访问布局作用域之外的数据.
原文:http://www.cnblogs.com/floraCnblogs/p/js-data-access.html