this关键字简单的说,this就是属性或方法“当前”所在的对象。this.propertyvarperson={name:'张三',describe:function(){return'姓名:'+this.name;}};person.describe()//"姓名:张三"在上面的代码中,这个.name代表name属性所在的对象。由于在describe方法中调用了this.name,而describe方法当前所在对象为person,则this指向person,this.name为person.name。使用场合(1)全局环境全局环境使用this,指的是顶层对象窗口。this===window//truefunctionf(){console.log(this===window);}f()//true(2)constructor构造函数中的this指的是实例对象。varObj=function(p){this.p=p;};如果对象的方法中包含this,则this的指向就是方法运行所在的对象。将此方法分配给另一个对象将改变this的指向。varobj={foo:function(){console.log(this);}};obj.foo()//上面obj的代码中,obj.foo方法执行时,其内部的this指向obj。但是,以下用法将改变这一方向。绑定this的方法Function.prototype.call()函数实例的调用方法可以在函数内部指定this的指针(即函数执行的作用域),然后在指定的作用域内调用函数.varobj={};varf=function(){returnthis;};f()===window//truef.call(obj)===obj//true在上面的代码中,全局环境运行函数f,this指向全局环境(浏览器是window对象);call方法可以改变this的指向,指定this指向对象obj,然后在对象obj的范围内运行函数f。Function.prototype.apply()func.apply(thisValue,[arg1,arg2,...])apply方法的第一个参数也是this要指向的对象。如果设置为null或undefined,相当于指定了全局对象。第二个参数是一个数组,数组的所有成员作为参数依次传递给原函数。原函数的参数必须在call方法中一个一个的加入,而在apply方法中必须以数组的形式加入。functionf(x,y){console.log(x+y);}f.call(null,1,1)//2f.apply(null,[1,1])//2Function.prototype.bind()bind()方法用于将函数体中的this绑定到一个对象上,然后返回一个新的函数。vard=newDate();d.getTime()//1481869925657varprint=d.getTime;print()//未捕获的类型错误:这不是日期对象。上面代码中,我们在d.getTime()方法中赋值给变量print,然后调用print()报错。这是因为getTime()方法的内部this绑定到Date对象的实例。赋值给变量print后,内部的this不再指向Date对象的实例。bind()方法可以解决这个问题。
