JavaScript中的this关键字使用方法总结
在javascritp中,不一定只有对象方法的上下文中才有this,全局函数调用和其他的几种不同的上下文中也有this指代。
它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用apply或call调用。
1.作为对象方法调用
在JavaScript中,函数也是对象,因此函数可以作为一个对象的属性,此时该函数被称为该对象的方法,在使用这种调用方式时,this被自然绑定到该对象。
varpoint={ x:0, y:0, moveTo:function(x,y){ this.x=this.x+x; this.y=this.y+y; } }; point.moveTo(1,1)//this绑定到当前对象,即point对象
2.作为函数调用
函数也可以直接被调用,此时this绑定到全局对象。在浏览器中,window就是该全局对象。比如下面的例子:函数被调用时,this被绑定到全局对象,接下来执行赋值语句,相当于隐式的声明了一个全局变量,这显然不是调用者希望的。
functionmakeNoSense(x){ this.x=x; } makeNoSense(5); x;//x已经成为一个值为5的全局变量
对于内部函数,即声明在另外一个函数体内的函数,这种绑定到全局对象的方式会产生另外一个问题。我们仍然以前面提到的point对象为例,这次我们希望在moveTo方法内定义两个函数,分别将x,y坐标进行平移。结果可能出乎大家意料,不仅point对象没有移动,反而多出两个全局变量x,y。
varpoint={ x:0, y:0, moveTo:function(x,y){ //内部函数 varmoveX=function(x){ this.x=x;//this绑定到了哪里? }; //内部函数 varmoveY=function(y){ this.y=y;//this绑定到了哪里? };
moveX(x); moveY(y); } }; point.moveTo(1,1); point.x;//==>0 point.y;//==>0 x;//==>1 y;//==>1