1、this的使用
1)作为对象的方法调用,this指的对象本身
var obj={ a:1, getA:function(){ alert(this===obj);//输出:true alert(this.a); //输出:1 } }
obj.getA();
2)作为普通函数调用,this指的是window对象
window.name='globalName'; var myObject={ name:'seven', getName:function(){ return this.name; } }; var getName=myObject.getName; console.log(getName()); //输出globalName
这里是变量getName引用myObject.getName方法。如果是myObject.getName(),会输出seven,这里是属于对象的属性调用。
3)构造器调用,this指的是构造器返回的对象
var MyClass=function(){ this.name='seven'; }; var obj=new MyClass(); alert(obj.name);
如果显式的返回Object对象,最终返回这个对象,而不是this
var MyClass=function(){ this.name='seven'; return { name:'anne' } }; var obj=new MyClass(); alert(obj.name);//输出anne
如果返回的是非对象类型,如字符串,依然会输出seven.
4)Function.prototype.call或Function.prototype.apply调用
都用于用于指定函数内this对象的指向.
call与apply区别:
a)apply的第一个参数指定this对象的指向,第二个参数为一个带下标的集合,可以是数组也可以是类数组。
var func=function(a,b,c){ alert([a,b,c]);//输出[1,2,3] }; func.applay(null,[1,2,3]); //null指向默认的宿主对象,浏览器中为window.
b)call的一个参数和apply一样指定this对象,后面多个参数。
var func=function(a,b,c){ alert([a,b,c]);//输出[1,2,3] }; func.call(null,1,2,3); //null指向默认的宿主对象,浏览器中为window.
解决上面用普通函数调用this丢失的问题
window.name='globalName'; var myObject={ name:'seven', getName:(function(){ return this.name; }) }; var getName=myObject.getName; console.log(getName.apply(myObject)); //输出seven