资源描述:
《javascript中的this,call,apply使用及区别详解_基础知识》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、JavaScript中的this,call,apply使用及区别详解学习起因:在之前的JavaScript学习中,this,call,apply总是让我感到迷惑,但是他们的运用又非常的广泛。遂专门花了一天,来弄懂JavaScript的this,call,applyo中途参考的书籍也很多,以《JavaScript设计模式与开发实践》为主,《JavaScript高级程序设计》、《你不知道的JavaScript》为辅。这三木书对我理解this,call,apply都起了很大的帮助。this首先,我们先讲述thiso在《JavaScript设计模式与开发实践》关于this的描述中,
2、我认为有一句话切中了this的核心要点。那就是:JavaScript的this总是指向一个对象具体到实际应用小,this的指向又可以分为以下四种:1.作为对象的方法调用2.作为普通函数调用3.构造器调用4.apply和call调用接F来我们去剖析前3点,至于第4点的apply和call调用,会在call和apply部分详细讲解。1•作为对象的方法调用说明:作为对象方法调用时,this指向该对象。举例:/***1・作为对彖的方法调用**作为对象方法调用时,this指向该对象。*/varobj={a:1,getA:function(){console.log(this===ob
3、j);console.log(this,a);}};obj.getA();//true,12•作为普通函数调用说明:作为普通函数调用时,this总是指向全局对象(浏览器屮是window)o举例:/***2•作为普通函数调用**不作为对彖属性调用时,this必须指向一个对彖。那就是全局对彖。*/window.namc二、globalNamc";vargetName=function(){console.log(this.name);};getName();//'globalName"varmyObject={name:〃0bjectName",getName:function
4、(){console.log(this.namc)myObject.getName();//'ObjectName,//这里实质上是把function(){console,log(this,name)}//这句话赋值给了theName0thisName在全局对彖中调用,自然读取的是全局对象的name值vartheName=myObject.getName;theName();//'globalName"3.构造器调用说明:作为构造器调用吋,this指向返回的这个对象。举例:/***3.作为构造器调用**作为构造器调用时,this指向返回的这个对象。*/varmyClass=
5、function(){this.name二〃Lxxyx〃;};varobj=newmyClass();console,log(obj.name);//Lxxyxconsole.log(obj)//myClass{name:〃Lxxyx〃}但是如果构造函数中手动指定了return其它对象,那么this将不起作用。如果return的是别的数据类型,则没有问题。varmyClass二function(){this.name二〃Lxxyx〃;//加入return时,则返回的是别的对象。this不起作用。return{name:〃ReturnOthers"}};varobj=newm
6、yClass();console,log(obj.name);//ReturnOthers3.Cal1和ApplyCall和Apply的用途一样。都是用来指定函数体内this的指向。Call和Apply的区别Call:第一个参数为this的指向,要传给函数的参数得一个一个的输入。Apply:第一个参数为this的指向,第二个参数为数组,一次性把所有参数传入。如果第一个参数为null,则this指向调用的本身。1.改变this扌旨向说明:这是call和apply最常用的用途了。用于改变函数体内this的指向。举例:varname=,,GlobalName,zvarfunc=f
7、unction(){console.log(this.name)};func();//"GlobalName"varobj={name:〃Lxxyx〃,getName:function(){console.log(this,name)}};obj.getName.apply(window)//,,GlobalName,/将this指向windowfunc.apply(obj)//〃Lxxyx〃将this指向obj2•借用其它对彖的方法这儿,我们先以一个立即执行匿名函数做开头:(function(a,b){conso