再读ecmascript

这几天,又花了点时间看了下ecmascript。以下是我摘录出来的一些理解。在此记录下。

第一部分:关于变量对象的理解

1) 什么是变量对象?
 
数据的存取与读取机制,就是变量对象。
 
     变量对象 是执行上下文相关的对象,包括3种:
  • 变量 (var )
  • 函数定义(FD)
  • 函数形参
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 对象是函数执行上下文中激活对象中的一个,有三个属性:
 
  1. callee 对当前函数的引用
  2. length 真实的参数个数
  3. properties-index  函数参数值
说明:如果真实的参数个数小于定义的参数个数,那么通过arguments方式来获得,是不行的。
 
 
 
3. var a =1 和 a=1  的区别
 
  • 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. 理论上,所有的函数都是闭包
 
欢迎大家拍砖!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章