你不知道的JavaScript---深入理解 JavaScript 中的 this 关键字

你好,我是小白Coding日志,一个热爱技术的程序员。在这里,我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客,一起在技术的世界里探索前行吧!

在 JavaScript 中,this 是一个十分重要且经常令人困惑的关键字。它的值在不同的情况下会有不同的解析方式,这也是 JavaScript 中面向对象编程中最具挑战性的部分之一。在本文中,我们将深入探讨 JavaScript 中 this 关键字的解析规则,帮助您更好地理解和应用它。

1. 简介

在 JavaScript 中,this 关键字代表当前执行上下文中的对象。但是,this 的值是在运行时动态确定的,并且取决于函数的调用方式。为了更好地理解 this 的解析规则,我们将分析以下几个常见的情况:

  • 全局上下文中的 this
  • 函数上下文中的 this
  • 构造函数中的 this
  • 箭头函数中的 this

2. 全局上下文中的 this

在全局执行上下文中,this 的值取决于执行环境。在浏览器中,全局执行上下文中的 this 指向的是 window 对象;在 Node.js 环境中,它指向的是 global 对象。

console.log(this === window); // 在浏览器中输出 true

3. 函数上下文中的 this

在函数内部,this 的值取决于函数的调用方式。如果函数作为对象的方法被调用,this 将指向调用该方法的对象;如果函数作为普通函数调用,this 将指向全局对象(在严格模式下为 undefined)。

const obj = {
  name: 'Alice',
  greet() {
    console.log(`Hello, ${this.name}!`);
  }
};

obj.greet(); // 输出 Hello, Alice!

const greetFunc = obj.greet;
greetFunc(); // 输出 Hello, undefined 或 Hello, undefined! (在严格模式下)

4. 构造函数中的 this

在构造函数中,this 指向通过 new 关键字创建的新对象。

function Person(name) {
  this.name = name;
}

const person = new Person('Bob');
console.log(person.name); // 输出 Bob

5. 箭头函数中的 this

箭头函数的 this 指向的是它所在的词法作用域的 this 值,而不是动态确定的。

const obj = {
  name: 'Alice',
  greet: () => {
    console.log(`Hello, ${this.name}!`);
  }
};

obj.greet(); // 输出 Hello, undefined 或 Hello, undefined! (在严格模式下)

6. 总结

通过以上分析,我们可以得出 JavaScript 中 this 关键字的解析规则:

  • 在全局上下文中,this 指向全局对象(window 或 global)。
  • 在函数中,this 的值取决于函数的调用方式,如果函数作为对象的方法被调用,this 将指向调用该方法的对象;如果函数作为普通函数调用,this 将指向全局对象(在严格模式下为 undefined)。
  • 在构造函数中,this 指向通过 new 关键字创建的新对象。
  • 在箭头函数中,this 指向的是它所在的词法作用域的 this 值,而不是动态确定的。

深入理解 JavaScript 中的 this 关键字对于编写高效、易维护的代码至关重要。希望本文能够帮助读者更好地理解和应用 JavaScript 中的 this 关键字。

最后还是那句话:即使代码逻辑很简单,也值得记录下来。我的编程目标是避免重复造轮子!😊
如果觉得有用,就给我点个赞吧😁探索更多有趣知识,欢迎关注我的微信公众号!每天分享精彩内容,与你一同探寻知识的边界。扫码即可订阅,一起开启知识新旅程!🚀📚

关注我的技术博客,探索前沿科技与实用开发技巧。一起携手走向代码的精彩世界!🚀💻 不错过每一篇精彩!

https://www.xiaobaicoding.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/556962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海外住宅代理:推特账号为何容易被关小黑屋?

推特是全球最受欢迎的社交媒体之一,每天都有数以百万计的用户在这个平台上发布信息、分享观点和交流互动。然而,有些用户可能会发现他们的推特账号不幸陷入了所谓的“关小黑屋”状态,即账号被限制了可见度,导致发布的内容无法被其…

【数据分析面试】24.20个数据库问答题 (考察数据开发和实际应用能力)

作为数据从业者,日常工作除了对各类业务数据进行分析挖掘,也需要经常和数据库打交道、甚至也少不了要承担一些数据开发、数仓管理的工作。掌握数据库管理的基本概念和技术是至关重要的。无论是初学者还是从业者,理解数据库索引、范式、事务、…

四.音视频编辑-音频混合-概述

引言 当我们在前两篇博客中成功地构建了一个媒体组合,并且略过了音频部分时,我们意识到了我们需要对这个项目进行更详细的探讨。在本篇博客中,我们将会展示如何创建一个包含视频轨道、配音音频轨道以及背景音频轨道的完整媒体组合。更进一步…

游泳耳机哪个牌子好?体验与口碑兼顾的4大游泳耳机汇总!

最近的天气越来越炎热了,许多人选择游泳作为一种既能锻炼身体又能享受清凉的活动。而随着科技的发展,越来越多的运动爱好者希望在游泳时也能享受到音乐的乐趣。因此,游泳耳机应运而生,成为市场上的热门产品。然而,面对…

项目中的解耦小能手-观察者模式

目录 1.使用场景 2.什么是观察模式 3.观察者模式结构图 4.代码实现案例 4.1 subject代码实现 4.2 Observer类代码实现 5. 回顾总结 1.使用场景 当一个对象的改变需要同事改变其他对象的时候,如:订单中心-下单成功需要通知库存、物流和积分去做相应…

交流回馈老化测试负载优点和应用

交流回馈老化测试负载是用于模拟真实环境下设备运行状态的测试工具,通过对设备进行长时间的连续工作,以检测其性能的稳定性和可靠性。这种测试负载具有许多优点,并且在实际应用中有着广泛的用途。 在实际应用中,设备往往需要在各种…

Flask实战

from flask import Flask appFlask(__name__)点击Flask同时点击键盘ctrl即可查看Flask的默认初始化函数 def __init__(self,import_name: str,static_url_path: str | None None,static_folder: str | os.PathLike[str] | None "static",static_host: str | None …

产品心理学:为什么管钱的都是女生?

大家发现了吗?大部分公司女财务居多,而在家庭中,多数也是女生管钱。 为什么管钱的都是女生?答案文尾揭晓。 问题的答案,要从一个心理学名词“过度自信偏差”说起 用人话说,就是“迷之自信” 过度自信的例…

【剪映专业版】11音频的全流程剪辑操作

视频课程:B站有知公开课【剪映电脑版教程】 1.音乐素材 可能包含人声,音乐素材普遍比较长,几十秒到几分钟。要点击倒三角才会出现分类。 点击下载箭头下载素材;点击加号将素材增加到轨道;时间指示器在哪个地方&#…

Python | Leetcode Python题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; class Solution:def searchInsert(self, nums: List[int], target: int) -> int:left, right 0, len(nums) #采用左闭右开区间[left,right)while left < right: # 右开所以不能有,区间不存在mid left (right - left)//2 # 防止溢出…

UE5增强输入系统 Enhanced Input

关键字&#xff1a; Enhanced Input 、 输入、映射、事件、鼠标、键盘、键鼠、动作、Trigger、触发器、 疑问&#xff1a; 新输入系统怎么做一个基础的案例&#xff1f;Trigger修改器中每个项都是什么功能&#xff1f;InputAction和InputMappingContext中都有修改器&#xff…

Python基础02-掌握HTTP API的秘诀

在下面文案基础上扩展&#xff0c;写一篇技术博客&#xff0c;标题要有吸引力&#xff1f; 标题&#xff1a; 在Python中&#xff0c;使用HTTP API已成为一种常见的操作。本文将深入探讨如何使用Python的requests库与HTTP API进行交互。我们将学习如何发送GET和POST请求、处理…

消息队列选型(RabbitMq、RocketMq、Kafaka)

文章目录 前言RabbitMq优点缺点 RocketMq优点缺点 Kafaka优点缺点 总结 前言 当引入消息队列时&#xff0c;常见的选择包括ActiveMQ、Kafka、RabbitMQ和RocketMQ。然而&#xff0c;近年来&#xff0c;ActiveMQ的活跃度已经下降&#xff0c;很多公司已经不再使用这款消息队列中…

TSINGSEE青犀算法中台消防通道堵塞/占压AI检测算法的介绍及应用

消防通道是建筑物内用于紧急疏散的通道&#xff0c;其畅通无阻对于保障人员生命安全至关重要。然而&#xff0c;由于各种原因&#xff0c;消防通道经常会被杂物、车辆等堵塞&#xff0c;一旦发生火灾等紧急情况&#xff0c;后果不堪设想。为了有效解决这一问题&#xff0c;我们…

【氮化镓】GaN HEMT失效物理和可靠性

概述: 本文是一篇关于AlGaN/GaN基高电子迁移率晶体管(HEMTs)的失效物理和可靠性研究的综述文章,发表在2013年10月的《IEEE Transactions on Electron Devices》上。文章由Enrico Zanoni等人撰写,主要关注了影响栅极边缘和肖特基结的失效机制,并探讨了提高这些器件可靠性…

文档加密软件哪个好用?为什么迅软DSE加密软件更受用户青睐?

通过对文档内容进行加密处理&#xff0c;以确保其安全性和保密性。文档加密软件采用加密算法对文档进行加密处理&#xff0c;在加密过程中&#xff0c;文档加密软件会将文档的原始内容转换为一种不可读的形式&#xff0c;即加密后的文档。这个加密过程是通过应用特定的加密算法…

SQVI创建以及生成程序

SAP数据快速查询工具&#xff1a;Sqvi-QuickView 项目实施&运维阶段&#xff0c;为了快速获取一些透明表数据&#xff0c;一开始接触项目肯定会通过大量的数据表查找&#xff0c;然后线下通过EXCEL通过VLOOKUP进行数据关联&#xff0c;这种方式在关联数据较少的情况比较适应…

spring boot获取请求参数并响应

获取请求参数并响应&#xff1a; 响应&#xff1a; 在Controller类或方法上加上ResponseBody注解&#xff0c;可以将方法返回值直接响应&#xff0c;如果返回值是实体对象或者集合&#xff0c;将转换为json格式响应。如下例&#xff1a; RestControllerResponseBodyControll…

Linux最常用的40个基本命令

目录 Linux基本命令命令1&#xff1a;ls &#xff08;查看指定目录中有哪些内容&#xff09;ls / 相当于查看根目录中的内容&#xff0c;相当于查看我的电脑ls -l&#xff08;小写l&#xff0c;或者使用ll&#xff09;详细查看目录下所有内容ls /usr/lib&#xff08;ls目录名称…

Java | Leetcode Java题解之第38题外观数列

题目&#xff1a; 题解&#xff1a; class Solution {public String countAndSay(int n) {String[] arr {"","1","11","21","1211","111221","312211","13112221","1113213211",…