在javascript中,this表示执行上下文,即指向一个对象的指针。
1.最高层的执行上下文是windows对象,在全局作用域中,变量与函数是windows对象的属性。直接调用一个函数fun(), 等价于window. func(),则函数func中的this指向的是 window对象。
(1)
var a = 1; function A(){ alert(this. a); } A(); 输出1。
A()等价于windows.A(), 函数A在windows上下文中执行,this指向windows对象。a在全局作用域中定义并赋值,a属于windows对象的属性,输出1。
(2)
var a = 1; var obj = { a : 2, A : function(){ alert(a); } } var B = obj. A; B(); 输出为1。
B()等价于windows.B(), 函数B(即obj. A)的执行上下文是windows, this指向windows对象,因此输出为1。
2.除了最高层的windows的对象,js生成的对象也可构成一个执行上下文。
(1)
var a = 1; var obj = { a : 2, A : function(){ alert(this. a); } obj.A(); 输出2。
函数A执行上下文是obj, this指向obj对像。this.a = obj.a = 2。
(2)
var a = 1; var obj = { a : 2, A : function(){ alert(this.a); } } function B(){ alert(this.a); } obj.C = B; obj.C(); 输出为2。
obj.C即B函数的执行上下文是obj,this指向obj。
B();
输出为1。
B函数的执行上下文是window对象,this指向window对象。
3.默认情况下,this指向上下文。此外,可以指定this的指向。
(1)通过new。执行new时,首先建一个空对象obj,再去执行类函数, 函数中的this指向新建的对象obj, 函数执行完后,obj被赋予一些属性。这个obj就是实例化的对象。
function Class(a,b){ this.a = a; this.b = b; } var obj = new Class('a','b');
this指向实例化的obj对象。
(2)通过apply()方法或call()方法。
function Parent(c,d){ this.c = c; this.d = d; } function Child(a,b,c,d){ Parent.apply(this,[c,d]);//使Parent函数中的this指向Child函数中的this(即对象child),并执行Parent函数。 this.a = a; this.b = b; } var child = new Parent('a','b','c','d');
alert(child.c);
输出c
call方法与apply方法相同,call方法以单个参数传数据,apply方法以一个数组作为传数据的参数,上面的代码可改为Parent.call(this,c,d)。