数据存取
JavaScript中四中基本的数据存取位置
- 字面量:不存于某个变量内
- 本地变量:var定义的
- 数组元素
- 对象成员
字面量、全局变量读取速度 > 数组项、对象成员 。因为局部变量存在于作用域链的起始位置
作用域
- 作用域链
函数创建——作用域中的scope属性(内部属性对象)——集合——作用域链(即函数创建后,内部的可访问数据对象在访问时填充而成) - 标识符解析
对变量在作用域中的搜索过程。在执行环境的作用域链中,一个标识符所在的位置越深,读取速度越慢。全局变量总存在于作用域链的某端。 - 少用动态作用域
with、try catch等,会导致js引擎的自身优化性能失效。 - 闭包:可以访问另一个函数中数据的函数。
可能导致性能问题:需要更多的内存开销,因为函数在调用时,会创建一个scope属性对象的活动对象,而这个对象包含了执行环境中活动对象的所有属性和方法,相当于是执行环境中活动对象的一个副本,所以在执行环境执行完后他不会被销毁,造成内存消耗,内存泄漏
解决:将常用的跨作用域的变量存储在局部变量中,直接访问 局部变量,这减轻了闭包的影响。
原型
- 概念:原型是其他对象的基础,定义了实现新创建的对象所必须包含的成员列表。
- 对象成员类型:
实例成员
原型成员:自动拥有 <——原型对象 - 原型链:创建一个对象,在使用该对象某些属性时,需要遍历他的原型对象的属性,或是他父级的一些属性或方时,形成一个链条。用来实现JS中的继承。
- 嵌套成员变量尽量少用。(嵌套越深,读取速度越慢)
原型链越深,读取速度越慢,越大;
解决:缓存对象成员值——> 保存到局部变量。