this的指向在函数运行的时候才确定。有4种情况:普通的this、作为对象方法、apply调用,this同级中有返回值。(这里的this都不是在严格模式下讨论)
一、普通的this:指向调用这个函数的对象。
例子1:指向window
function MyObject(){
console.log(this);
}
MyObject();//window
window.MyObject();//window
console.log(this);//window
这里第一次调用的MyObject其实是window调用的,js可以省略window(如alert()就是)
例子2:指向调用的对象
function MyObject(){
console.log(this);
}
var b = new MyObject();//MyObject
console.log(b instanceof MyObject);//true
new Myobject();//MyObject
变量b是一个MyObject的对象,在new的过程中,创建了一个新对象,将构造函数的作用域赋值给新对象,执行构造函数中的代码,返回新对象。new可以改变this的指向,var b这里将this指向了b,无论有没有接收的对象这里都是新建立了一个MyObject对象。
例子3:
二、作为对象方法:指向调用对象的父级
例3:
function f1(){
this.pro1 = '1';
console.log(this.pro1);
console.log(this);
}
var a = {};
a.pro = f1();//'1',window
a.proa = f1;
a.proa();//1,object(这里是a)
console.log(a.pro1);//1
这里的this是调用它的对象(a.proa)的父级(a)。
三、apply调用:指向apply()括号里面的对象。
首先说一下apply()的作用是改变调用函数的对象。
例4:
var x = 0;
function f1(){
console.log(this.x);
}
var y = {};
y.x = 1;
y.pro = f1;
y.pro.apply();//0
y.pro.apply(window);//0,没有参数默认是window
y.pro.apply(y);//1
四、this同级中有返回值:若返回值是一个对象,this指向返回对象,若不是,则指向函数的实例。
例5:指向本身
function f2(){
this.x = 1;
return this;
}
var a = new f2();
console.log(a.x);//1
例6:this指向b
function f3(){
this.x = 2;
var b = {};
b.x = 0;
return b;
}
var c = f3();
console.log(c.x);//0
例7:this指向3
function f4(){
this.x = 1;
return 3;
}
var d = f4();
console.log(d.x);//undefined
例8:this指向null
function f5(){
this.x = 1;
return null;
}
var e = f5();
console.log(e.x);//Cannot read property 'x' of null
若返回值是一个对象,this指向返回对象,若不是,则指向函数的实例。因为null也是对象,所以this指向null。