javascript中四种基本的数据存取位置:
1,直接量:只代表自己,不存储在特定位置,包括字符串、数字、布尔值、对象、数组、函数、正则表达式、null值、undefined值
2, 变量:var定义的数据存储单元
3,数组元素:存储在数组内部,以数字作为索引
4,对象成员:存储在对象内部,以字符串作为索引
直接量和局部变量的访问速度快于数组项和对象成员的访问速度。
一个函数被创建的作用域中对象的集合叫作函数的作用域链(键值对)
其中包括一个单独的可变对象(window,navigator,document等等)。
执行函数时,由运行期上下文(函数执行的环境)按对象在函数中出现的顺序生成活动对象(包括所有局部变量、命名参数、参数集合、this),然后将活动对象推入作用域链的前端。
函数访问数据时都需要去搜索运行期上下文的作用域链,查找同名的标识符,搜索过程从作域链头部开始,也就是当前运行函数的活动对象,直到找到为止。如果到最后还没找到,则认为该标识符是未定义的。并且,假如有多个同名的标识符的话,只会查找第一个。函数中读写局部变量是最快的,而读写全局变量是最慢的。
如果某个跨作用域的值在函数中被引用一次以上,那么建议把它存储到局部变量里。
With(document等):把document等括号内的对象置 于作用域的头部,会使其它局部变量标识符的识别。
catch: 把异常对象置于作用域的头部,同样会影响局部变量标识符的识别。
eval(code) 执行代码。代码格式为字符串。
闭包:
闭包的[[Scope]]属性包含了与运行期上下文作用域相同的对象和引用,因为会有一项副作用,激活对象无法被销毁。占内存,可能会导致内存泄露。
对象成员包括属性和方法。
原型,我感觉相当它的父类。在Firefox、Safari、Chrome中这个属性_proto_即表示它的原型。
var book ={ title:"标题", publisher:"雅虎" }; alert(book.hasOwnProperty("title"));//true 表示title是实例成员 alert(book.hasOwnProperty("toString"));//false 表示该实例中没有toString alert("title" in book);//true alert("toString" in book);//true 都返回true,表示用in操作符时会搜索实例也搜索实例的原型。
对象的原型决定了实例的类型。所有对象都是对象Object的实例。
function Book(title,publisher){ this.title=title; this.publisher=publisher; } Book.prototype.sayTitle=function(){ alert(this.title); }; var book1=new Book("标题","雅虎"); var book2=new Book("测试","哈哈"); alert(book1 instanceof Book);//true alert(book1 instanceof Object);//true
上面的示例中,book1的原型(_proto_)是Book.prototype,Book.prototype的原型是Object.
原型链越深,搜索实例成员越慢。
嵌套成员: 每次遇到点操作时,导致js引擎搜索所有对象成员。所以location.href比window.location.href要快。 object.name和object["name"]功能差不多(Safari中点符号会快些)。
不要在同一个函数里多次查找同一个对象成员,除非它的值改变了。应该用查找一次保存为局部变量。