这几天,又花了点时间看了下ecmascript。以下是我摘录出来的一些理解。在此记录下。
第一部分:关于变量对象的理解
1) 什么是变量对象?
数据的存取与读取机制,就是变量对象。
变量对象 是执行上下文相关的对象,包括3种:
2) 关于函数的arguments
function foo(x,y,z){
z=40;
y=50;
alert(arguments.callee===foo);
alert(arguments.length); //1
alert(arguments[1]); //undefine
alert(arguments[2]); //undefine
}
foo(10)
arguments 对象是函数执行上下文中激活对象中的一个,有三个属性:
-
callee 对当前函数的引用
-
length 真实的参数个数
-
properties-index 函数参数值
说明:如果真实的参数个数小于定义的参数个数,那么通过arguments方式来获得,是不行的。
-
var a 是变量对象 不能通过delete 删除
-
a 是属性 能通过delete 删除
变量和属性一个最大的区别是 :变量有一个属性【DontDelete】表示不能删除
注意:有一个执行上下文对该规则无效,那就是 eval('var a =1')
4 看看例子
alert(a);
alert(b);
window.a=1;
a = 1;
this.a=1;
var b =2;
==============================================
第二部分:关于this的理解
1) this 在进入上下文的时候确定,在代码执行期间一成不变
2) 什么影响了this 值的变化:
this是有激活上下文代码和调用者来提供的,即调用函数的父上下文。
调用函数的方式决定了this的值
3) 什么是引用类型?
包括2个属性:
1. base 拥有属性的对象
2. base中property name 对象的属性名
引用类型的值由2中情况:
1.处理一个标示符的时候
2.属性访问器的时候
4)作为构造器的函数的this
this被设置为新创建的对象
5)一个通用规则
this 是由调用者提供,由调用函数的方式而定
有2中情况:
1.如果()左边的是引用类型的值,那么this将被设置为引用类型的base对象。
2.其他情况下,全部为null,但是这个null自动转化为window 对象
6) this 是一个动态特性,在函数执行的时候确定
================================================
第三部分:作用域链的理解
1.对于函数而言,变量对象就是激活对象,对于全局上下文而言,变量对象就是全局变量本身。
2.作用域链其实就是所有内部上下文变量对象的列表。
3.函数的作用域链是在函数调用的时候创建出来的,包含了活跃对象和和该函数的内部scope属性。
4.函数内部[[Scope]]机制:
scope 是一个包含了所有上层对象的分层链,他属于当前函数的上下文,在函数创建的时候
保存在函数中的。
scope 是在函数创建的时候保存的,是一个静态特性。
5.函数的生命周期
分为创建阶段和激活(调用)2个阶段
6. 函数上下文为scope
= AO+[[scope]] AO为激活对象
7.什么是闭包?
闭包就是函数代码与[[scope]]属性的组合,[[scope]]包含了创建函数创建
所有在上下文环境,上层上下文中的变量,可以在函数激活的时候,通过变量的词法作用域链
查询到。
8.通过 Function 创建的函数,其[[scope]]
属性永远只包含全局对象
9.如果在作用域链中没有查到,那么会查询到原型链中
==========================================================
第四部分:闭包的理解
1. ecmascript 是静态(词法)作用域的语言
2. 闭包 是函数代码块与代码块的上下文数据的组合
3. 在ecmascript中,同一个上下文创建的闭包通用同一个[[scope]] 属性的
4. 理论上,所有的函数都是闭包
欢迎大家拍砖!!