在谈及this的时候,很多js编程者脑子都很混乱,因为在一般的js使用者的手中,使用到this的几率着实不多,在事件中,this一般指向事件触发者,addEventListener和attachEvent除外(关于事件绑定和委托请看我另外一个相关的博客)
实际上this始终指向对象,而这个对象则是方法的调用者;
比如:
1 function f1(){ 2 console.log(this); 3 } 4 f1();//object window
实际上f1函数写在那里不是加个括号就自己调用了的,f1函数本质上是属于window对象的方法,也就是说f1()等同于window.f1();
那么这个this的指向是window就没有问题了
也就是说在正常情况下,this一直指向调用该函数的对象;
那么call()方法的作用是干什么的呢?
1 function f2(a) { 2 console.log(a); 3 console.log(this); 4 } 5 var obj = {}; 6 f2.call(obj,2)//结果 2 和 {} 7 obj.f2(1);//报错 obj.f2 is not a function
通过上面的代码可以得知call()方法的作用是可以改变f2()调用的时候方法里面的this的指向,call()的第一个参数就是指向的对象,但是这并不意味着obj具有了f2()方法,
当我们使用obj对象调用时,发现报错,obj并没有这么个方法,所以call()的作用改变this的指向,也就是说改变调用方法的对象,不能改变方法拥有者本身,
而call()的第二个参数向后都是方法本身的参数;
形象点必须就是,我的东西让你使用,但是东西还是我的,不过用的人是你;
因此得出来的结论是,在js中,this总指向调用方法的对象,但是指向是可以通过调用call()方法来改变的,却不能改变方法的拥有者;
另外一个就是apply()方法和call()类似只不过他有2个参数,第二个参数是一个数组来存放参数;