this的指向本质上是指向调用者的,即谁调用函数或方法,this就指向这个调用者。它取决于函数的调用,而函数有三种调用方式。
所以我们根据这个本质,按照不同的环境把this指向划分为三个不同的场景。
1.调用处于全局作用域的函数下,this指向全局即window对象。
我们举个简单栗子:
function fn() {
console.log(this);
}
fn() //this指向window
fn函数处于全局作用域下,调用fn时,其实本质上是window在调用,即window.fn(),所以这时this就是指向window。我们看下打印this的结果:
2.当调用对象里面的方法(函数)时,this指向该实例对象
栗子:
let obj = {
name: 'xia',
age: '19',
say: function () {
console.log(this)
}
}
obj.say() //this指向该对象obj
上面的栗子中匿名函数function属于实例对象中的一个方法叫say,当我们调用这个实例对象的say方法时,即obj.say();obj此时就是调用者,所以this指向调用者obj对象。我们看下打印的结果:
3.当调用构造函数用来生成一个实例对象时(即用new 来创建对象), 此时this指向该构造函数的实例对象
我们同样举个例子:
function Obj() {
say = function () {
console.log(this);
}
}
let obj1 = new Obj() //this指向实例对象obj1
obj1.say()
由构造函数Obj通过new来创建的一个实例对象可以直接调用say方法,此时this就指向这个obj1实例对象。我们看看打印结果:
所以我们可以根据不同的函数调用场景来总结出三种this的指向:
1.调用处于全局作用域的函数下,this指向全局即window对象。
2.当调用对象里面的方法(函数)时,this指向该实例对象
3.当调用构造函数用来生成一个实例对象时(即用new 来创建对象), 此时this指向该构造函数的实例对象