在js中this不像其它语言那样容易理解,它有时候指window对象,有时候又是其它对象,那么this,你究竟是谁呢?
要分析this就要先理解js中的方法定义,由于this通常都是在方法中使用的,并且方法在js中的地位又很特殊。 函数
在js中定义的方法必定不会单独存在,它一定属于某个对象,因此this就是表明方法属于的那个对象。this
一、通常方法spa
function test() { alert(this==window); } test();
像这种普通的方法定义,方法并无属于某个对象呀?其实js里有个全局的window对象,没错,这个方法就是定义在window对象下了,因此里面的this确定就是window。prototype
二、方法,仍是方法code
function test1(){ function test2(){ alert(this==window) } test2() } test1();
这种状况呢,test2没有明显的属于某个对象,那它就...对,那它就属于window对象,因此里面的this就是指window对象。对象
三、对象的方法blog
var o={ test:function(){ alert(this==window); } } o.test();
这种状况就很容易理解了,test方法属于o对象,this固然是指o对象了。事件
四、再见对象get
function Persion () { this.name="mu"; } Persion.prototype.show=function(){ alert(this.name); } var p=new Persion(); p.show();
再来看Persion方法,这里的Persion是构造函数,因此this就是指new的时候js建立的匿名对象,这个匿名对象又赋给了p对象,因而this就是指p对象。io
五、别忘了事件
var btn=document.getElementById("btn"); btn.onclick=function(){ alert(this); }
onclick方法属于btn对象,因此this指向btn
btn.addEventListener("click",function(){ alert(this); }) btn.attachEvent("onclick",function(){ alert(this); });
这里比较特殊了,前者是W3C标准的,this指向btn,后者是ie专有的,this指定window,这里只能死记了。
最后总结一句话:this表明谁,就看方法属于谁,ie事件绑定指window对象!