this的值取决于它所在的函数如何被调用。下面是this可以获得新值的6种不同方式:
- this在全局范围内
- this在对象的构造函数内
- this在对象的方法内
- this在一个简单的函数内
- this在箭头函数内
- this在一个事件侦听器内
下面我们一起来看看this是如何在每个环境中被改变的。
一、this在全局范围内
当this在任何函数外面被调用时,也就是说在全局环境中被调用,在浏览器中。它默认指向window对象。
console.log(this) // Window
一般在全局环境中,我们很少用this关键字 ,所以我们对它也没有那么在意,继续看下一个环境。
二、this在对象的构造函数内
当我们使用new关键字创建一个对象的新的实例时,this关键字指向这个实例。
function Human (age) {
this.age = age;
}
let greg = new Human(22);
let thomas = new Human(24);
console.log(greg); // this.age = 22
console.log(thomas); // this.age = 24
通过上面的代码,我们会发现,greg是Human的一个实例,现在无论何时调用greg,this都不会指向thomas。所以让this指向对象的实例 是完全有道理的。
接下来让我们看一个密切相关的环境。
三、this在对象的方法内
方法是与对象关联的函数的另一个通俗叫法,如下所示。
(注: 这里的方法是用ES6语法来写的, 如果不知道它们是什么, 请参见这里).
let o = {
// A method
aMethod(){}
}
在对象的任何方法内的this都是指向对象本身。
let o = {
sayThis(){
console.log(this);
}
}
o.sayThis() // o
![](https://i-blog.csdnimg.cn/blog_migrate/0ef967d6ade344abc020ad256d1cd2e4.png)
既然this指向对象本身,你就可以用方法来获取对象的实例,如下所示:
function Human(name) {
return {
name,
getName() {
return this.name;
}
}
}
const zell = new Human("Zell");