javaScript this 详解
在实际应用中,this的指向大致可以分为以下四种。
# 作为对象的方法调用
# 作为普通函数调用时
# 构造器调用。
1.作为对象的方法调用,this指向该对象
当函数作为对象的方法被调用时,this指向该对象;
例子:
var obj={
a:1,
getA:function(){
alert(this===obj);//输出 :true; this 指向obj
alert(this.a);//输出1;
}
}
obj.getA();
当 函数(getA) 作为对象(obj)的方法被调用时,this指向该对象;
2.作为普通函数调用时,this的指向;
当函数不作为对象的属性被调用时,也就是我们通常所说的普通函数方式,此时的this总是指向全局对象。
例子:
window.name='globalName';
var getName=function(){
return this.name;//这里的this指向的 window(全局对象)
}
console.log(getName())//输出‘globalName’
或者:
window.name='globalName';
var myObject={
name:'sven',
getName:function(){
return this.name;
}
}
var getName=myObject.getName;
myObject.getName()//输出sven
console.log(getName());//输出globalName
3.构造器调用。
构造器的外表跟普通函数一模一样,他们的区别在于被调用的方式,当用new运算符调用函数时,该函数总会返回一个对象,通常情况下,构造器里的this就指向返回的这个对象:
var MyClass = function(){
this.name='sven';
}
var obj = new MyClass();
alert(obj.name)//输出sven
这里需要注意的是:如果构造器返回了一个Object类型的对象,那么,此次的运算结果最终会返回这个对象,而不是我们之前期待的this
var MyClass = function(){
this.name='sven';
return {
name:'anne' //返回的是一个对象: {name:'anne'}
}
}
var obj = new MyClass();
alert(obj.name)//输出anne
如果构造器不显示地返回任何数据,或者是一个非对象类型的数据,就不会造成上诉问题