图解JavaScript中的this关键字

图解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读取cookie函数代码

    下面我为您讲解如何编写Javascript读取cookie函数代码的完整攻略。 第一步:创建函数 首先,我们需要创建一个读取cookie值的函数。可以按照以下方法编写: function getCookie(name) { var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(…

    JavaScript 2023年6月11日
    00
  • javascript对象小结

    Javascript对象小结 Javascript中的对象是一种复合的数据类型,它可以包含多个属性,每个属性可以是任意类型的数据。本文将对Javascript对象进行一些总结,包括如何创建对象、如何访问对象属性等。 创建对象 1. 使用字面量 使用字面量可以方便地创建一个对象,只需要使用一对大括号,并在其中添加多个属性即可。 var person = { n…

    JavaScript 2023年5月18日
    00
  • 简单通过settimeout看javascript的运行机制

    如何通过 setTimeout 看 JavaScript 的运行机制? JavaScript 是一门单线程语言。也就是说,在浏览器环境下所有的代码只会在一个线程上执行。而 setTimeout 函数可以进行一定的调度,这也是 JavaScript 事件机制的基础。 那么如何通过 setTimeout 来理解 JavaScript 的运行机制呢?下面是一个详细…

    JavaScript 2023年6月11日
    00
  • 详解JavaScript匿名函数和闭包

    详解JavaScript匿名函数和闭包 JavaScript匿名函数和闭包在程序员开发中经常用到,本文将对它们进行详细的介绍,并提供两个示例,以便读者更好地理解。 什么是匿名函数? 在JavaScript中,函数可以具有名称和匿名两种形式。没有名称的函数称为匿名函数。匿名函数不需要用函数名调用,可以通过函数变量调用。 匿名函数的语法如下: var x = f…

    JavaScript 2023年6月10日
    00
  • 基于javascript实现漂亮的页面过渡动画效果附源码下载

    下面详细讲解一下“基于javascript实现漂亮的页面过渡动画效果附源码下载”的完整攻略。 一、前言 随着互联网的发展,用户对于网站的要求也越来越高,而页面过渡动画效果可以很好的提高用户体验,增强网站的吸引力。在这篇攻略中,我们将会介绍如何基于Javascript实现漂亮的页面过渡动画效果。 二、概述 本攻略将会通过两个实例来说明如何利用Javascrip…

    JavaScript 2023年6月10日
    00
  • 一文详解JavaScript闭包典型应用

    一、JavaScript闭包基础概念 闭包指的是函数内部能够访问其外部作用域的一种机制。简单来说,闭包就是一个函数引用了其包含作用域中的变量(即使在该函数外部调用时也能够访问这些变量)。通常,一个函数执行完毕后,其内部变量将会释放,但如果该函数内部存在闭包,则这些变量仍然会被保存。 二、闭包的经典应用 实现函数记忆 函数记忆是一种用来缓存函数结果的技术。它可…

    JavaScript 2023年6月10日
    00
  • JavaScript箭头(arrow)函数详解

    JavaScript箭头(arrow)函数详解 箭头函数的概念 Arrow Function 是 ECMAScript 6 引入的新特性,通常又称为箭头函数。它是一种更简洁、更易读、更简单的函数定义方式。 箭头函数表达式语法形如: (param1, param2, …, paramN) => { statements } 箭头函数完整语法可以看做简化版…

    JavaScript 2023年5月27日
    00
  • 原生js实现日历效果

    原生js实现日历效果 实现日历效果,需要完成以下几个步骤: 获取年月数据 绘制日历框架 填充日期数据 绑定事件 1. 获取年月数据 通过Date()获取当前时间信息,包括年、月、日等信息。 const currentDate = new Date(); let currentYear = currentDate.getFullYear(); let curr…

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