相信很多刚刚学习js的新手都会有同感,当看一段js代码时,发现里面有很多this,但是这些this到底是指向哪里却没有那么清楚,为了搞清楚这些this到底是什么情况,特地花点时间总结如下几点:
1.最普遍的this表示全局对象
// 1.this表示全局对象
var x = 1
function test1(){
this.x = 2;
console.log(this.x);
}
test1();//输出为2
解析:设置全局变量x初始值为1,当调用函数test1()之后改变全局变量x的初始化值,故为2
2.对象方法中的this(这里this就指这个上级对象)
例1:
var name = "全局this";
var object = {
name : "对象中this",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
console.log(object.getNameFunc()());//输出:全局this
例2:
var name = "全局this";
var object = {
name : "对象中this",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
console.log(object.getNameFunc()());//输出:对象中this
例3
var name = "全局this";
var object = {
name : "对象中this",
getNameFunc : function(){
var that = this;
return function(){
return that.name+","+this.name;
};
}
};
console.log(object.getNameFunc()());//输出:对象中this,全局this
例4
function test2(){
console.log(this.y);
}
var obj = {};
obj.y = 2;
obj.func= test2;
obj.func();//输出2
解析:在例1中,直接this调用全局,而在例2中this表示函数的上一级对象,故此时的this是对象object;在例4中test2函数被赋值给对象obj,所以此时的this表示对象obj
3.构造函数调用(实际上也可以理解成是一个对象,跟2中一样)
var a = 1;
function test3(){
this.a = 2;
}
var gz = new test3();
console.log(a);//输出1
console.log(this.a);//输出1
console.log(gz.a);//输出2
解析:当new test3()弄成一个新的对象的时候,test3里面的this指向的是gz,所有全局变量没有变化