返回

此篇文章将通过实例解析 JS 中的 this 关键字

前端

JS 中的 this 是一个很容易让人困惑的概念,因为它与其他现代编程语言中的用法有所不同。在其他语言中,this 通常是指当前对象,但在 JS 中,this 的值取决于函数的调用者。这意味着,在不同的上下文中,this 可能指向不同的对象。

以下是一些常见的 this 关键字的使用场景:

  • 在方法中,this 指向该方法所属的对象。例如,如果我们有一个名为 "person" 的对象,并且该对象有一个名为 "greet" 的方法,那么在 "greet" 方法中,this 将指向 "person" 对象。
  • 在构造函数中,this 指向新创建的对象。例如,如果我们有一个名为 "Person" 的构造函数,那么在 "Person" 构造函数中,this 将指向新创建的 "Person" 对象。
  • 在事件处理程序中,this 指向触发事件的元素。例如,如果我们有一个名为 "button" 的按钮,并且该按钮有一个名为 "onclick" 的事件处理程序,那么在 "onclick" 事件处理程序中,this 将指向 "button" 元素。
  • 在箭头函数中,this 指向定义箭头函数的作用域。例如,如果我们有一个名为 "myFunction" 的箭头函数,并且该箭头函数在 "person" 对象中定义,那么在 "myFunction" 箭头函数中,this 将指向 "person" 对象。

值得注意的是,this 关键字在全局作用域中没有值。这意味着,如果我们在全局作用域中使用 this 关键字,它将返回 undefined。

要更好地理解 this 关键字,我们来看几个示例:

// 示例 1:在方法中使用 this 关键字
const person = {
  name: "John Doe",
  greet: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

person.greet(); // 输出:Hello, my name is John Doe

在这个示例中,我们在 "person" 对象中定义了一个名为 "greet" 的方法。在 "greet" 方法中,我们使用 this 关键字来访问 "person" 对象的 "name" 属性。

// 示例 2:在构造函数中使用 this 关键字
function Person(name) {
  this.name = name;
}

const person1 = new Person("John Doe");
const person2 = new Person("Jane Smith");

console.log(person1.name); // 输出:John Doe
console.log(person2.name); // 输出:Jane Smith

在这个示例中,我们定义了一个名为 "Person" 的构造函数。在 "Person" 构造函数中,我们使用 this 关键字来给新创建的 "Person" 对象的 "name" 属性赋值。

// 示例 3:在事件处理程序中使用 this 关键字
const button = document.querySelector("button");

button.addEventListener("click", function() {
  console.log(this); // 输出:<button>...</button>
});

button.click();

在这个示例中,我们使用 "addEventListener" 方法为 "button" 元素添加了一个 "click" 事件处理程序。在 "click" 事件处理程序中,我们使用 this 关键字来访问触发 "click" 事件的 "button" 元素。

// 示例 4:在箭头函数中使用 this 关键字
const person = {
  name: "John Doe",
  greet: () => {
    console.log(`Hello, my name is ${this.name}`);
  }
};

person.greet(); // 输出:undefined

在这个示例中,我们在 "person" 对象中定义了一个名为 "greet" 的箭头函数。在 "greet" 箭头函数中,我们使用 this 关键字来访问 "person" 对象的 "name" 属性。但是,由于箭头函数没有自己的作用域,因此 this 关键字在箭头函数中指向 undefined。

通过这些示例,我们对 JS 中的 this 关键字有了一个基本的了解。在实际开发中,this 关键字的使用可能更加复杂,但只要掌握了基本原理,就可以灵活地使用 this 关键字来编写出正确的 JS 代码。