JavaScript 之中如何正确理解 this
2023-10-21 14:00:28
JavaScript 之中 this 的理解并不能一概而论,应该根据不同的函数类型和调用方式来分析。
文章将围绕 JavaScript this 来进行讨论。相信看完这篇文章,你将对 JavaScript this 有一个全新的认识。
this 指向函数自身
存在这个误解可能是因为在 JavaScript 中既然函数是一个对象,那么就可以在这个函数对象上通过 key/value 的形式存储某些值,比如下面:
function func() {
this.a = 1;
}
const obj = new func();
console.log(obj.a); // 1
从上面的代码来看,this 确实指向了函数自身,因为在函数 func 中,this 被赋值为 1,而在 obj 对象上访问 this.a 属性时,就能够获取到这个值。
但是,需要注意的是,这种情况下,this 并不是指向函数本身,而是指向了一个新的对象,这个对象是通过 new 创建的。
this 指向调用它的对象
当一个函数被一个对象调用时,this 就指向这个对象。例如:
const obj = {
a: 1,
func: function() {
console.log(this.a); // 1
}
};
obj.func();
在这个例子中,当 obj.func() 被调用时,this 就指向了 obj 对象,因此在 func 函数中访问 this.a 属性时,就能够获取到 obj 对象的 a 属性值。
this 指向 window 对象
当一个函数在全局作用域中被调用时,this 就指向 window 对象。例如:
function func() {
console.log(this.location); // "https://example.com"
}
func();
在这个例子中,当 func() 函数在全局作用域中被调用时,this 就指向了 window 对象,因此在 func 函数中访问 this.location 属性时,就能够获取到 window 对象的 location 属性值。
箭头函数的 this
箭头函数没有自己的 this,它继承外层函数的 this。例如:
const obj = {
a: 1,
func: () => {
console.log(this.a); // undefined
}
};
obj.func();
在这个例子中,当 obj.func() 被调用时,this 指向 obj 对象,因此在 func 函数中访问 this.a 属性时,就会获取到 obj 对象的 a 属性值。
但是,如果把 func 函数改写成箭头函数,如下所示:
const obj = {
a: 1,
func: () => {
console.log(this.a); // undefined
}
};
obj.func();
那么,this 就不会指向 obj 对象了,而是指向 window 对象。这是因为箭头函数没有自己的 this,它继承外层函数的 this。而在 obj 对象中,外层函数是全局函数,因此 this 就指向 window 对象了。
构造函数的 this
当一个构造函数被调用时,this 就指向一个新创建的对象。例如:
function Person(name) {
this.name = name;
}
const person = new Person('John');
console.log(person.name); // "John"
在这个例子中,当 new Person('John') 被调用时,this 就指向了一个新创建的对象,这个对象是通过 Person 构造函数创建的。因此,在 Person 构造函数中访问 this.name 属性时,就能够获取到这个新创建的对象的 name 属性值。
类的 this
在类中,this 的指向与构造函数相同,都指向一个新创建的对象。例如:
class Person {
constructor(name) {
this.name = name;
}
getName() {
return this.name;
}
}
const person = new Person('John');
console.log(person.getName()); // "John"
在这个例子中,当 new Person('John') 被调用时,this 就指向了一个新创建的对象,这个对象是通过 Person 类创建的。因此,在 Person 类中访问 this.name 属性时,就能够获取到这个新创建的对象的 name 属性值。
总结
this 在 JavaScript 中是一个非常重要的概念,它可以指向不同的对象,具体取决于函数的类型和调用方式。
希望通过这篇文章,你能够对 JavaScript this 有一个全新的认识。