javascript中this用法实例详解
本文实例讲述了javascript中this用法。分享给大家供大家参考,具体如下:
JavaScript中的this含义非常丰富,它可以是全局对象,当前对象或者是任意对象,这都取决于函数的调用方式。函数有以下几种调用方式:作为对象方法调用、作为函数调用、作为构造函数调用、apply或call调用。
对象方法调用
作为对象方法调用的时候,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对象
这里我想强调一点内容,就是this是在函数执行的时候去获取对应的值,而不是函数定义时。即使是对象方法调用,如果该方法的函数属性以函数名的形式传入别的作用域,也会改变this的指向。我举一个例子:
vara={ aa:0, bb:0, fun:function(x,y){ this.aa=this.aa+x; this.bb=this.bb+y; } }; varaa=1; varb={ aa:0, bb:0, fun:function(){returnthis.aa;} } a.fun(3,2); document.write(a.aa);//3,this指向对象本身 document.write(b.fun());//0,this指向对象本身 (function(aa){//注意传入的是函数,而不是函数执行的结果 varc=aa(); document.write(c);//1,由于fun在该处执行,导致this不再指向对象本身,而是这里的window })(b.fun);
这样就明白了吧。这是一个容易混淆的地方。
函数调用
函数也可以直接被调用,这个时候this被绑定到了全局对象。
varx=1; functiontest(){ this.x=0; } test(); alert(x);//0
但这样就会出现一些问题,就是在函数内部定义的函数,其this也会指向全局,而和我们希望的恰恰相反。代码如下:
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
我们会发现不但我们希望的移动呢效果没有完成,反而会多出两个全局变量。那么如何解决呢?只要要进入函数中的函数时将this保存到一个变量中,再运用该变量即可。代码如下:
varpoint={ x:0, y:0, moveTo:function(x,y){ varthat=this; //内部函数 varmoveX=function(x){ that.x=x; }; //内部函数 varmoveY=function(y){ that.y=y; } moveX(x); moveY(y); } }; point.moveTo(1,1); point.x;//==>1 point.y;//==>1
构造函数调用
在javascript中自己创建构造函数时可以利用this来指向新创建的对象上。这样就可以避免函数中的this指向全局了。
varx=2; functiontest(){ this.x=1; } varo=newtest(); alert(x);//2
apply或call调用
这两个方法可以切换函数执行的上下文环境,也就是改变this绑定的对象。apply和call比较类似,区别在于传入参数时一个要求是数组,一个要求是分开传入。所以我们以apply为例:
varname="window"; varsomeone={ name:"Bob", showName:function(){ alert(this.name); } }; varother={ name:"Tom" }; someone.showName();//Bob someone.showName.apply();//window someone.showName.apply(other);//Tom
可以看到,正常访问对象中方法时,this指向对象。使用了apply后,apply无参数时,this的当前对象是全局,apply有参数时,this的当前对象就是该参数。
箭头函数调用
这里需要补充一点内容,就是在下一代javascript标准ES6中的箭头函数的this始终指向函数定义时的this,而非执行时。我们通过一个例子来理解:
varo={ x:1, func:function(){console.log(this.x)}, test:function(){ setTimeout(function(){ this.func(); },100); } }; o.test();//TypeError:this.funcisnotafunction
上面的代码会出现错误,因为this的指向从o变为了全局。我们需要修改上面的代码如下:
varo={ x:1, func:function(){console.log(this.x)}, test:function(){ var_this=this; setTimeout(function(){ _this.func(); },100); } }; o.test();
通过使用外部事先保存的this就行了。这里就可以利用到箭头函数了,我们刚才说过,箭头函数的this始终指向函数定义时的this,而非执行时。所以我们将上面的代码修改如下:
varo={ x:1, func:function(){console.log(this.x)}, test:function(){ setTimeout(()=>{this.func()},100); } }; o.test();
这回this就指向o了,我们还需要注意一点的就是这个this是不会改变指向对象的,我们知道call和apply可以改变this的指向,但是在箭头函数中是无效的。
varx=1, o={ x:10, test:()=>this.x }; o.test();//1 o.test.call(o);//依然是1
这样就可以明白各种情况下this绑定对象的区别了。
更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。