黑马训练营-this对象在ECMAScript学习笔记

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

在ECMAScript中的this对象不同于其他OOP语言中,在用法有很大的不同,下面一一进行整理:

目录:

  1. 前置知识
  2. this在什么时候初始化?(可能有点绕,表达不是很清晰,看下去吧!)
  3. this的"指针"?
  4. 怎么给this赋值?
  5. 总结

 

前置知识

  • AO:ActiveObject,即活动对象,在ECMAScript中,当声明一个函数后,就会在AO中生成一个部分
  • VO:VariableObject,即变量对象,声明一个变量后,会在VO中生成一个实例。注意,尽管a=10后,能够正确的复制,但却得不到正确的变量声明,即这个过程没有声明变量,事迹的过程是window.a=10,仅仅在window对象中添加一个a,并赋值为10,但并没有在VO中存储该变量!
1 var a = 10;
2 b = 10;
3
4 alert(delete a); //false
5 alert(delete b); //true

delete无法删除VO中的实例

this在什么时候初始化?(可能有点绕,表达不是很清晰,看下去吧!)
其他变量在变量声明的时候,进行初始化,如下:
 1 function foo () {
2 var i = 10;
3 return i;
4 }
5
6 var obj = {
7 method: function () {
8 console.log(foo());
9 }
10 }
以上代码将返回10,那么再来看看下面的代码:
 
function foo () {
return this;
}

var obj = {
method: function () {
console.log(foo.call(this) == window);
}
}
运行后的结果为false,可以看出this和变量的区别了吧。this关键字是在运行时进行初始化的!
 
this的"指针"?
下面来看看this在何种情况将引用全局对象,又在何种情况引用局部变量呢。
先来看看下面一段话:
全局函数上下文与全局上下文中的this将引用window对象,在某个对象中的函数上下文中的this将引用这个对象本身。
 
怎么理解这句话呢?
看代码先:
window.name = 'gob';
function foo () {
alert(this.name);
}

foo(); //'gob'

var obj = {
name: 'Sam',
method: function () {
alert(this.name); //'Sam'
},
method2: function () {
foo(); //'gob'
}
}
先看第一个foo()将返回window的name属性,因为函数foo是全局环境的函数,因此this.name == window.name(true)
第二个,obj.method()方法中,属于obj函数内,因此this.name指向了obj.name
再看第三个方法,obj.method2(),引用的同样是全局函数foo,因此this同样是window,
那么:
var obj = {
name: 'Sam',
method3: function () {
(function () {
alert(this.name); //同样为window.name
})();
}
}
在obj.method3()方法中定义了一个函数表达式,这个表达式调用了this.name,但此时this仍然是指向window,因为function创建后仍然是全局函数
 
怎么给this赋值?
this = document
上述的语句是没有任何意义的!
要给this赋值,请看下面示例:
function foo () {
return this;
}

var obj = {
method: function () {
console.log(foo() == window); //执行后返回true
console.log(foo.call(this) == window); //执行后返回false
}
}
第一个console就如同上面一节说的foo()中的this==window(true)
但请看foo.call(this),call()方法接受一个参数,这个参数将给函数体中的this进行赋值,就这么简单
因此foo.call(this)也可以写成:foo.call(obj)
 
那么对于foo()方法,有这么几个例子是永远成立的:
foo.call([Object _object]) == [Object _object] (true);
    即:foo.call(document) == document (true)等
foo.call(null) == window (true);
foo.call(undefined) == window (true);
对于后面两个式子有这么一句话,当call传入的参数为null/undefined时,被call的函数语句块内部this将指向window

总结:
  • this对象在运行时被初始化(不知道怎么表达这个动作,但是暂且用初始化吧)
  • this在函数声明(全局or not)指向window对象
  • this的赋值通过call()方法来实现,并且在call(null/undefined)时,this被指向window(无缝不入啊)

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------
详细请查看:http://net.itheima.com/

posted @ 2012-03-13 23:42  Yorkie  阅读(170)  评论(0编辑  收藏  举报