首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
this指针一般常用的有一下几种情况:
情况一:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,而是underfined。
function test(){
var name = "John";
console.log(this.name); //undefined
console.log(this); //Window
}
test(); //实际上是window.test();
情况2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
var a = {
name:"CC",
b:{
name:"John",
fn:function(){
console.log(this.name); //John
console.log(this); //b
}
}
}
a.b.fn();
//这里的上一级是b,也就是说给b调用了,所以这里的this指向b的作用域。
情况3:将对象赋予给新创建的实例
var a = {
name:"CC",
b:{
name:"John",
fn:function(){
console.log(this.name); //undefined
console.log(this); //window
}
}
}
var new = a.b.fn; //将fn函数复给new
new(); //window.new();和情况1一样
情况4:构造函数,new实例
function Fn(){
this.name = "John";
}
var a = new Fn();
console.log(a.name); //John
这里我们构造了实例a,这里的this指针指向了a的作用域,因为name的上一级调用对象是a。而实例a原本是没有东西的,空空如也。但是我们通过构造函数new给了a,也就是将Fn里的东西复制给了a,所以现在a有了东西。