您的位置:首页 > Web前端 > JavaScript

js this的指向详解

2016-05-21 14:42 891 查看
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到一个数组里面然后传递给函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息