js 的this指向主要有四种:
1.作为对象的方法调用,这个时候this指向的事该对象
例如: var obj={
a:1,
getA:function(){
alert(this===obj);//true
alert(this.a);//1
}
}
2.作为普通函数调用,这个时候this总是指向全局对象(在浏览器中既window对象)
window.name='zhangshan';
var getName=function(){
console.log(this.name);//zhangshan
}
3.作为构造器调用,这个时候this的指向就分情况了,主要是看构造器有没有显式返回一个对象。
当用new 运算符调用函数时,该函数总会返回一个对象,通常情况this就是指向这个对象的
但是如果构造器显式的返回一个object类的对象,那么运算结果最终返回的事那个对象而不是this,所以这个时候this指向的对象就是显式返回的那个对象
var MyClass1 = function() {
this.name = '111';
}
var obj1 = new MyClass1();
alert(obj1.name); //111
var MyClass2 = function() {
this.name = '111';
return { //显式的返回一个对象
name: '222';
}
}
var obj2 = new MyClass2();
alert(obj2.name); //222
4.Function.prototype.call或者Function.prototype.apply可以动态改变this
两者的功能完全一样,只是参数不同
call第一个参数是this要指向的上下文,后面跟着的参数不固定,都是当成函数的参数传递进去
apply第一个参数也是this要指向的上下文,后面是一个数组或者类数组,数组的每一项按照顺序当成是函数的参数传递进去,也可以这样理解这个数组就是函数的arguments
var obj1 = {
name: '111';
}
var obj2 = {
name: '222';
}
window.name = 'window';
var getName= function(a,b) {
alert(this.name);
alert(a);
alert(b);
}
getName();//window,undefined,undefined;
getName.call(obj1,'a','b');//111,a,b
getName.apply(obj2,'a','b');//222,a,b
就这麽简单:
1.总结来讲,call和apply都是为了改变某个函数运行时的上下文,换句话说就是改变函数内部this的指向,js的函数上下文
可以分为定义时上下文,运行时上下文。而且上下文是可以改变的。
2.为什么要改变向上下文呢????????? 主要是为了实现一种情况,当一个对象没有某个方法
的时候,而且另外一个对象却有这个方法,这个时候就可以通过改变上下文来使用自己没有的方法了。
比如:obj1没有showName()方法,obj2有,这个时候可以这个样子使用,var temp=obj1.prototype.call(obj2);这样就可以用obj2的方法了
3.那什么时候用call什么时候用apply????????
当参数个数是固定不变的时候可以用call,当参数个数不确定可以用apply,把要传递的参数push到一个数组里面然后传递给函数