this 是一个关键字,它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。
1.作为纯粹的函数调用 this 指向全局对象
2.作为对象的方法调用 this 指向调用对象
3.作为构造函数被调用 this 指向新的对象(new 会改变 this 的指向)
4.apply 调用 this 指向 apply 方法的第一个参数
首先必须要说的是,this的指向在函数定义的时候是确定不了的,
只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象
() function a() { var user = "这是this"; } a(); // window.a(); console.log(this.user); //undefined console.log(this); // window //由于this最终指向的是调用它的对象,这里的函数a实际是被Window对象所点出来的 (
)
` var o = {
user: “这是this”,
fn: function() {
// console.log(this.user); //这是this
// console.log(this);
}
}
o.fn();
//这里的this指向的是对象o,因为调用这个fn是通过o.fn()执行的,那自然指向就是对象o,
//this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁
var o = {
a: 10,
b: {
// a: 12,
fn: function() {
console.log(this.a); // undefined
console.log(this); //object
}
}
}
o.b.fn();
//这里可以看到,this指向的并不是对象o中的属性a,而是对象b中的属性a,
//因为如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象,
//如果一个函数中有this,这个函数中被多个对象所调用,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象
`
var o = { a: 10, b: { a: 12, fn: function() { console.log(this.a); // undefined console.log(this); // window } } } var j = o.b.fn; j();
//this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的,
//虽然函数fn是被对象b所引用,但是在将fn赋值给变量j的时候并没有执行所以最终指向的是window
`
function Fn() {
this.user = "这是this";
console.log(this); // Fn
}
var a = new Fn();
console.log(a.user); // 这是this
//对象a可以点出函数Fn里面的user是因为new关键字可以改变this的指向,将这个this指向对象a,为什么a是对象,
//因为用了new关键字就是创建一个对象实例,
//这里用变量a创建了一个Fn的实例(相当于复制了一份Fn到对象a里面),
//此时仅仅只是创建,并没有执行,而调用这个函数Fn的是对象a,那么this指向的自然是对象a,
//至于对象a中会有user,因为已经复制了一份Fn函数到对象a中,用了new关键字就等同于复制了一份
`