图解JavaScript中的this关键字

yizhihongxing

图解JavaScript中的this关键字

在JavaScript中,this关键字是一个非常重要和常用的概念。this关键字代表着当前调用函数的对象。但是,由于JavaScript中函数的灵活性,this的值有时会令人不太容易理解和把握。本文将图解this的实际应用及其背后的原理,帮助读者更好地理解和应用this关键字。

this的取值方式

JavaScript中函数的调用方式可以分为以下几种,不同的调用方式影响了this的取值。

1.函数调用

这是最简单的一种方式,直接以函数名作为入口调用函数。

function example() {
  console.log(this);
}
example(); // Window

这时,函数体中的this关键字被绑定到了全局对象window上。

2.对象方法调用

在一个对象方法中调用this时,this被绑定到该方法所属的对象上。

const person = {
  name: 'Tom',
  sayHello() {
    console.log(this.name);
  }
};
person.sayHello(); // Tom

3.构造函数调用

构造函数调用方式一般用于实例化对象,此时this被绑定到新创建的对象上。

function Person(name) {
  this.name = name;
}
const person = new Person('Tom');
console.log(person); // Person { name: 'Tom' }

在构造函数调用中,this所绑定到的是通过new构造函数创建出的新对象。

4.apply/call调用

通过函数的applycall方法调用函数时,可以明确指定this应该绑定的对象。

function introduce() {
  console.log(`Hi, my name is ${this.name}.`);
}
const person = { name: 'Tom' };
introduce.call(person); // Hi, my name is Tom.

applycall调用中,第一个参数可以是要绑定到this上的对象。

this的注意事项

由于JavaScript中函数的灵活性和变化多端,this关键字可能会引起一些意料之外的问题。下面介绍两个比较常见的注意事项。

1.箭头函数

箭头函数在规定了this后,不会在执行的时候被改变。

const person = {
  name: 'Tom',
  sayHello: () => {
    console.log(this.name);
  }
};
person.sayHello(); // undefined

这里因为箭头函数所绑定的this是在定义函数时就被锁定住的,因此即使通过对象调用,this还是会被绑定到全局对象上。

2.回调函数

回调函数中的this指向可能会因为回调函数的不同场景而有所不同。

const person = {
  name: 'Tom',
  sayHello() {
    console.log(`Hi, my name is ${this.name}.`);
    setTimeout(function () {
      console.log(`But you can call me ${this.nickname}.`);
    }, 1000);
  },
  nickname: 'Tommy'
};
person.sayHello();
// Hi, my name is Tom.
// Uncaught TypeError: Cannot read properties of undefined (reading 'nickname')

在这个例子中,setTimeout函数中的回调函数this指向的是window对象,因此在这里访问this.nickname会抛出类型错误。

解决这个问题有两种方法:

  1. 使用箭头函数
 const person = {
  name: 'Tom',
  sayHello() {
    console.log(`Hi, my name is ${this.name}.`);
    setTimeout(() => {
      console.log(`But you can call me ${this.nickname}.`);
    }, 1000);
  },
  nickname: 'Tommy'
};
person.sayHello();
  1. 在调用回调函数的时候明确指定this
const person = {
  name: 'Tom',
  sayHello() {
    const self = this;
    console.log(`Hi, my name is ${this.name}.`);
    setTimeout(function () {
      console.log(`But you can call me ${self.nickname}.`);
    }, 1000);
  },
  nickname: 'Tommy'
};
person.sayHello();

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:图解JavaScript中的this关键字 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • javascript asp教程第十一课–Application 对象

    JavaScript ASP 教程第十一课 — Application 对象 什么是 Application 对象 ASP 的 Application 对象是服务器端的全局对象,用于存储应用程序全局数据并使多个用户共享这些数据。Application 可以在 ASP 应用程序的任何页面中访问,因此非常有用。 如何使用 Application 对象 设置 A…

    JavaScript 2023年5月27日
    00
  • srcElement表格样式

    srcElement 表示事件源对象,即触发该事件的元素。通过该属性,我们可以对事件源对象执行一些操作,比如修改元素的样式等。 在表格中,我们可以利用该属性来修改表格的样式,下面提供两个示例说明。 示例一:通过鼠标悬浮事件修改表格行背景色 <table> <tr> <th>姓名</th> <th>年…

    JavaScript 2023年6月10日
    00
  • javascript每日必学之多态

    JavaScript每日必学之多态 什么是多态? 多态是指对象在不同场合下可以表现出不同的行为。在面向对象编程中,多态是一个重要的概念,它能够增强代码的灵活性和可扩展性。 实现多态的方式 在JavaScript中,实现多态的方式通常有两种: 1. 通过函数的参数实现 使用函数的参数实现多态,需要用到函数重载的概念。在JavaScript中,由于函数的参数个数…

    JavaScript 2023年5月18日
    00
  • JavaScript setTimeout和setInterval的用法与区别详解

    JavaScript setTimeout和setInterval的用法与区别详解 setTimeout()和setInterval()是JavaScript中的两个重要函数,它们都用于实现JavaScript中的定时器。通常,我们使用这两个函数来延迟执行一段代码或者重复执行一段代码。但是setTimeout()和setInterval()用法和区别还是有很…

    JavaScript 2023年6月11日
    00
  • JavaScript使用function定义对象并调用的方法

    JavaScript中可以使用function定义一个函数,同时也可以使用function定义一个对象。这种方式定义的对象被称为“构造函数”,使用new关键字调用这个构造函数就可以生成一个新的对象。 定义构造函数 下面是一个定义构造函数的示例代码: function Person(name, age) { this.name = name; this.age…

    JavaScript 2023年5月27日
    00
  • 微信小程序 倒计时组件实现代码

    下面就来分享微信小程序中倒计时组件的实现过程吧。 准备工作 在开始具体讲解之前,需要对微信小程序的基础知识有一定的了解,包括:- 小程序的目录结构- WXML、WXSS、JS、JSON 文件的作用- 小程序的基础组件和事件绑定等操作 倒计时组件实现步骤 1. 创建小程序项目 首先,在微信开发者工具中创建一个基础的小程序项目。 2. 创建倒计时组件 在项目中创…

    JavaScript 2023年6月11日
    00
  • vue3动态添加路由

    Vue3是一款流行的JavaScript框架,用于构建可复用的Web组件和复杂的单页应用程序。Vue3允许在运行时动态添加路由,从而增强了Web应用程序的可扩展性和灵活性。 以下是Vue3动态添加路由的完整攻略: 1. 安装Vue Router 在开始使用Vue3动态添加路由之前,需要安装Vue Router。可以使用npm或yarn进行安装。例如,在使用n…

    JavaScript 2023年6月11日
    00
  • JS获取当前日期时间并定时刷新示例

    获取当前日期时间并定时刷新是一个常见的前端需求,可以通过JavaScript实现。下面将详细介绍如何实现这个功能并提供两条示例说明。 步骤一:获取当前日期时间 我们可以使用JavaScript中的Date对象来获取当前日期时间。可以使用Date类的方法getYear(),getMonth(),getDay(),getHours(),getMinutes()和…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部