this call和apply
this指针总是指向一个对象,大致可以分为以下四种:
1,作为对象的方法调用(this指向该对象)
2,作为普通函数调用
当函数不作为对象的属性被调用时,也就是普通函数方式,此时的this总是指向全局对象。在浏览器的javascript中,全局对象就是windows。
1 window.name='globaiName'; 2 var getName=function(){ 3 return this.name; 4 }; 5 console.log(getName());
3,构造器调用
javascript中没有类,但是可以从构造器中创建对象,同时也提供了new运算符,使得构造器看起来更像一个类。
当用new运算符调用函数时,该函数总会返回一个对象,通常,构造器里的this就指向返回的这个对象
var MyClass(){ this.name='sven'; }; var obj=new MyClass(); alert(obj.name);
但是如果构造器显示的返回了一个object类型的对象,那么结果最终会返回这个对象。
var MyClass(){ this.name='sven'; return { //显示返回一个对象 name:'anne'; } }; var obj=new MyClass(); alert(obj.name); //输出anne
4,Function.prototype.call 和 Function.prototype.apply
每个函数都具有call()和apply()方法,他们的作用一样,区别在于传入参数的形式不同。
apply接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数作为一个带下标的集合,可以是数组,也可以是类数组。
call传入的参数数量不固定,第一个参数指定了函数体内this对象的指向,从第二个参数开始,每个参数被依次传入函数。
如果我们传入的第一个参数是null时,函数体内的this会指向默认的宿主对象,在浏览器中就是window。
1 document.getElementById = (function (func){ 2 return function(){ 3 return func.apply(document,arguments); 4 } 5 })(document.getElementById); 6 var getId = document.getElementById; 7 var div = getId('div1'); 8 alert(div.id); //输出div1