this是Javascript语言的一个关键字。正确掌握了 JavaScript 中的 this 关键字,才算迈入了 JavaScript 这门语言的门槛。
this 不是变量,不是属性,不能为其赋值,它始终指向调用它的对象。
只要记住最重要的一条即可“它始终指向调用它的对象” ,所以找到调用this的对象,就知道this到底指向谁了
它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。
下面分四种情况,详细讨论this的用法。
情况一:纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。
function test(){
this.x = 1;
alert(this.x);
}
test(); // 1
var test = function(){
alert(this === window);
}
test(); //true
纯粹的函数调用也有感觉上似乎复杂的:
var test = function(){
var innerTest = function(){
alert(this === test);
}
innerTest();
}
test();
你不会认为弹出"true"吧,不是按照上面的理论'innerTest'是被'test'调用的,然后'this'就指向'test'吗?
额,错就错在是谁调用的'innerTest', 其实这种函数都是'window'对象调用的,即使你嵌套一千层,调用各个函数的都是'window'对象,奉上下面这段代码为证
var test = function(){
var innerTest = function(){
alert(this === window); //true
var innerTest1 = function(){
alert(this === window); //true
}
innerTest1();
}
innerTest();
}
test();
情况二:作为对象方法的调用
函数还可以作为某个对象的方法调用,这时this就指这个上级对象。
function test(){
alert(this.x);
}
var obj = {};
obj.x = 1;
obj.m = test; //作为对象的方法调用
obj.m(); //1
下面的你不会认为结果为"false"吧!,'test1'和'test' 两个都指向一个对象,所以是true。关键记住”this 始终指向调用它的对象“。
var test ={
'a':1,
'b':function(){
alert(this === test)
}
}
var test1 = test;
test1.b(); //true
下面是 "true" 还是 "false" 呢?
var test ={
'a':1,
'b':{
'b1':function(){
alert(this === test);
}
}
}
test.b.b1();
按照上面的理论,这时 "this" 不再直接被 'test' 调用了,而是被 'test.b' 调用, 奉上下面一段代码为证:
var test ={
'a':1,
'b':{
'b1':function(){
alert(this === test.b);
}
}
}
test.b.b1(); //true
情况三 作为构造函数调用
所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。
function test(){
this.x = 1;
}
var o = new test();
alert(o.x); // 1
下面构造函数”new test()“创建了一个新的空对象,然后再由这个对象指向函数"test"中的代码,因此此时this不在是window对象,而是该构造函数创建的新对象
var test = function(){
alert(this === window);
}
new test(); //false
情况四 apply调用
apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。
var x = 0;
function test(){
alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0
apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改为: o.m.apply(o); //1
运行结果就变成了1,证明了这时this代表的是对象o。
再来一段:
var test = function(){
alert(this === window);
}
var test1 = {
}
test.apply(test1); //false
apply作用就是”调用一个对象的一个方法,以另一个对象替换当前对象“ 所以了'window' 对象已经被替代为'test1',自然为'false'了,奉上如下代码以为证明:
var test = function(){
alert(this === test1);
}
var test1 = {
}
test.apply(test1); //true