返回
JavaScript 中的 this 指向问题及其实际应用
前端
2023-10-27 17:14:14
在 JavaScript 中,this 指向问题异常重要,因为在开发中要经常用到 this。所以,我在本篇文章中将对 this 指向问题进行讲解。在讲解之前,要声明两点:
- this 是一个,而非保留字,因此在严格模式下,可以重新赋值。
- this 的指向与函数的调用方式和对象的使用方式密切相关。
this 指向的本质
this 指向的是函数执行时,内部可以访问的对象。确切地说,this 指向的是函数被调用时,所属的那个对象。
如果函数不是作为一个对象的方法被调用,则 this 指向的是全局对象(在浏览器中是 window 对象)。
this 的指向规则
1. 默认绑定
当函数作为普通函数调用时,this 指向全局对象。例如:
function sayHello() {
console.log(this); // 输出:Window {window: Window, self: Window, document: HTMLDocument, name: "", location: Location, ...}
}
sayHello();
2. 隐式绑定
当函数作为对象的方法被调用时,this 指向该对象。例如:
const person = {
name: "John",
sayHello: function () {
console.log(this); // 输出:{name: "John", sayHello: ƒ}
},
};
person.sayHello();
3. 显式绑定
使用 call()
、apply()
和 bind()
方法可以显式地绑定 this 指向。
call()
方法:显式地将 this 指向指定的对象,并将参数作为单独的参数传递给函数。例如:
const person = {
name: "John",
};
function sayHello() {
console.log(this.name);
}
sayHello.call(person); // 输出:John
apply()
方法:与call()
方法类似,但参数作为数组传递给函数。例如:
const person = {
name: "John",
};
function sayHello(age) {
console.log(this.name + ", " + age);
}
sayHello.apply(person, [25]); // 输出:John, 25
bind()
方法:返回一个新函数,该函数的 this 指向固定为指定的对象。例如:
const person = {
name: "John",
};
function sayHello() {
console.log(this.name);
}
const boundSayHello = sayHello.bind(person);
boundSayHello(); // 输出:John
this 指向的实际应用
1. 对象的方法
在对象的方法中,this 指向该对象本身。这使得我们可以访问对象的属性和方法。例如:
const person = {
name: "John",
sayHello: function () {
console.log(this.name);
},
};
person.sayHello(); // 输出:John
2. 事件处理程序
在事件处理程序中,this 指向触发事件的元素。例如:
const button = document.getElementById("myButton");
button.addEventListener("click", function () {
console.log(this); // 输出:<button id="myButton">...</button>
});
3. 构造函数
在构造函数中,this 指向新创建的对象。例如:
function Person(name) {
this.name = name;
}
const person = new Person("John");
console.log(person.name); // 输出:John
4. 箭头函数
在箭头函数中,this 指向与包含它的函数相同。例如:
const person = {
name: "John",
sayHello: () => {
console.log(this); // 输出:{name: "John", sayHello: ƒ}
},
};
person.sayHello();
总结
this 指向是一个复杂但重要的概念。通过理解 this 指向的规则和实际应用,可以更好地编写 JavaScript 代码。