js 对象内的方法this不指向对象?js对象中this指向的问题

缘起

今天在写一个工具方法封装成对象模块导出时,由于成员方法内调用了其他成员方法,而且成员方法用了箭头函数() => 定义,导致使用 this.成员方法() 不能调用该成员方法,console.log(this)发现为 undefined

export default {// 成员方法1getVersion: () => {return '1.0'},// 成员方法2test: () => {// 此处this为undefined,执行test方法会报错this.getVersion()},// 成员方法3,常规函数写法,this指向正常test2() {this.getVersion()},// 成员方法4,常规函数写法,this指向正常test3: function() {this.getVersion()},
}

缘由

JavaScript中,方法内的this指向是动态的,它取决于函数的调用方式。在对象内的方法被调用时,this通常指向调用该方法的对象。但是,如果方法被其他方式调用(例如,作为回调函数或使用apply/call改变this的绑定),this可能会指向其他对象。

如果在对象内的方法中this不指向该对象,常见的原因是因为使用了不正确的调用方式,例如使用了箭头函数或者方法被提升到了全局作用域。

解决方法:

确保方法是作为对象的属性直接调用的,而不是作为一个全局函数或者在其他上下文中调用。

如果使用箭头函数,箭头函数不绑定自己的this,它会捕获其在定义时所处的上下文中的this值。如果需要在对象内部方法中使用this,请使用常规函数声明。

使用.bind()来在对象方法被提取时保持this的引用。

如果是作为回调函数调用的,请确保回调内的this是正确绑定的,可以使用.call.apply来指定this的值。

示例代码:

// 假设有以下对象
const myObject = {name: 'example',// 使用常规函数,确保this指向myObjectsayName: function() {console.log(this.name);},// 如果需要在方法中使用箭头函数,请确保this的行为sayNameWithArrow: () => {console.log(this.name); // 这里的this可能不指向myObject}
};// 正确调用方式
myObject.sayName(); // 输出 'example'// 如果使用箭头函数需要修正为:
const myObject = {name: 'example',sayNameWithArrow: () => {console.log(this.name); // 如果在对象定义以外的地方访问,这里的this可能不是预期的对象}
};// 使用常规函数或者bind来解决
myObject.sayNameWithArrow = function() {console.log(this.name); // 这里的this指向myObject
};// 或者
myObject.sayNameWithArrow = () => {console.log(this.name); // 如果需要访问外层的this,可以在外层作用域中绑定this
};// 使用bind来确保this指向myObject
myObject.sayNameWithBind = function() {console.log(this.name); // 这里的this指向myObject
}.bind(myObject);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 菜单组件开发教程

在 Vue 项目中&#xff0c;我们常常需要构建各种菜单结构。下面就来详细介绍如何基于给定的代码来开发一个菜单组件。 组件部分 一、模板部分 <template> <template v-for"item in menuTree" :key"item._id"> <el-sub-menu v-if"i…

opencv的findContours()函数

来自WaTab AI Pro 请详细解释cv2.findContours()&#xff1a; cv2.findContours() 是 OpenCV 中用于检测图像轮廓的函数。轮廓可以看作是将连续的点&#xff08;沿边界&#xff09;连接在一起的一条曲线&#xff0c;具有相同的颜色或强度。该函数常用于图像处理和计算机视觉中…

EtherCAT协议概述

EtherCAT 是由德国 BECKOFF 自动化公司于2003年提出的实时工业以太网技术。它具有高速和高数据有效率的特点&#xff0c;支持多种设备连接拓扑结构。其从站节点使用专用的控制芯片&#xff0c;主站使用标准的以太网控制器。 EtherCAT 的主要特点如下 : ①泛的适用性&#xff0c…

c++指针的*

1.*运算符 *运算符被称为间接值&#xff08;indirect value&#xff09;或者解除引用&#xff08;dereferencing&#xff09;运算符 将其应用于指针可以得到该地址处存储的值 由于 * 也有乘法的意思&#xff0c;c通过上下文来确定是乘法还是解除引用 2.如何声明和初始化指针 …

【Pandas】深入解析`pd.read_sql()`函数

【Pandas】深入解析pd.read_sql()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xf…

《KAN》论文笔记

原文出处 KAN: Kolmogorov–Arnold Networks (arxiv.org)https://arxiv.org/html/2404.19756v1 论文笔记 What 《KAN: Kolmogorov–Arnold Networks》——我们提出了 KolmogorovArnold Networks (KANs) 作为多层感知器 (MLP) 的有前途的替代方案。 我们表明&#xff0c;这…

STM32简易音乐播放器(HAL库)

一、设计描述 本设计以STM32MP157A单片机为核心控制器&#xff0c;加上其他的模块一起组成基于单片机的音乐盒的整个系统&#xff0c;通过不同频率的PWM使蜂鸣器播放音乐&#xff0c;通过按键中断实现歌曲切换&#xff0c;音量调节&#xff0c;定时器中断实现播放速度调节&…

基于 HTML5 和腾讯云播放 SDK 开发的 M3U8 在线播放器

在当前的网络视频领域&#xff0c;M3U8 文件格式是一种广泛应用的流媒体播放格式&#xff0c;具有广泛的兼容性和稳定性。为了在网页上实现 M3U8 格式的在线播放&#xff0c;我们可以结合 HTML5 技术和腾讯云播放 SDK&#xff0c;快速开发一个功能强大的 M3U8 在线播放器。 体验…

kafka-生产者发送消息消费者消费消息

文章目录 1、生产者发送消息&消费者消费消息1.1、获取 kafka-console-producer.sh 的帮助信息1.2、生产者发送消息到某个主题1.3、消费主题数据 1、生产者发送消息&消费者消费消息 1.1、获取 kafka-console-producer.sh 的帮助信息 [rootlocalhost ~]# kafka-console…

16-云原生监控体系-监控 RabbitMQ-rabbitmq_exporter [部署Dashborad告警规则实战]

文章目录 1. 二进制方式部署1.1. 二进制包下载1.2. 配置1.2.1. 可用的环境变量1.2.2. 使用变量2. docker-compose 方式部署3. Metrics3.1. Global3.2. Overview3.3. Queues3.3.1 Queues - Gauge3.3.2. Queues - Counter3.4. Exchanges - Counter</

Xunsearch:实现拼音搜索和中文分词功能

首先我们需要安装xunsearch扩展库&#xff0c;参考 1、设置分词器和拼音搜索功能 在创建Xunsearch对象后&#xff0c;可以设置相应的分词器和拼音搜索功能。以下代码示例演示了如何设置分词器和拼音搜索功能&#xff1a; $index $xunsearch->index; $index->setToken…

解决SSH客户端远程连接CentOS7虚拟机时加载过慢问题

1、编辑 /etc/ssh/sshd_config 文件&#xff0c;将 useDNS 中的 yes 改为 no &#xff0c;关闭UseDNS加速&#xff1a; vi /etc/ssh/sshd_config2、重启ssh服务: systemctl restart sshd

Golang 创建第一个web项目(Gin + Gorm)

1. 写这篇博客的由来&#xff1a; 当你想使用最快的框架创建项目的时候是不是有点束手无策&#xff1f; 当你想配置数据库写 SQL 甚至不知道如何写&#xff0c;文件夹都不知道建在哪里&#xff1f; &#x1f604;因为Golang 目前并没有 JAVA 那种硬性规范&#xff0c;但是…

kafka-主题创建(主题操作的命令)

文章目录 1、topic主题操作的命令1.1、创建一个3分区1副本的主题1.1.1、获取 kafka-topics.sh 的帮助信息1.1.2、副本因子设置不能超过集群中broker的数量1.1.3、创建一个3分区1副本的主题1.1.4、查看所有主题1.1.5、查看主题详细描述 1、topic主题操作的命令 kafka发送消息会存…

巨额分红与大幅下调募资金额,小方制药注册生效半年后仍无进展

《港湾商业观察》施子夫 2022年7月1日&#xff0c;上海小方制药股份有限公司&#xff08;以下简称&#xff0c;小方制药&#xff09;递表上交所板&#xff0c;2023年9月1日公司提交了注册申请&#xff0c;并于同年12月19日获得生效。 离挂牌上市仅有一步之遥的小方制药注册生…

flutter开发实战-外接纹理texture处理图片展示

flutter开发实战-外接纹理处理图片展示 在Flutter中&#xff0c;如果你想要创建一个外接纹理的widget&#xff0c;你可以使用Texture widget。Texture widget用于显示视频或者画布&#xff08;canvas&#xff09;的内容。该组件只有唯一入参textureId 通过外接纹理的方式&…

迁移基于MicroBlaze处理器的设计

迁移基于MicroBlaze处理器的设计 生成系统基础设施&#xff08;MicroBlaze、AXI_Interconnect&#xff0c; Clk_Wiz、Proc_Sys_Reset&#xff09; 生成系统基础设施&#xff08;MicroBlaze、AXI_Interconnect、Clk_Wiz和 Proc_Sys_Reset&#xff09;&#xff1a; 1.使用所需的板…

Effective C++ 不要滥用宏

1.用宏的坏处 #define PI 3.14 用宏定义PI 所有遇到PPI的都替换为3.14 若是发生错误 这就是3.14 看不到这个PPI 用const 代替 如 const double Pi 3.14; 2.const替换宏 宏是不可修改的 const char * Text "hello"; 这只代表 "hello"不可改变 可…

素数环_回溯法

课本例题&#xff1a; 素数环是一个计算机程序问题&#xff0c;指的是将从1到n这n个整数围成一个圆环&#xff0c;若其中任意2个相邻的数字相加&#xff0c;结果均为素数&#xff0c;那么这个环就成为素数环。 #include <iostream>#include <cmath>using namespa…

2024年【危险化学品经营单位安全管理人员】考试报名及危险化学品经营单位安全管理人员找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品经营单位安全管理人员找解析题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品经营单位安全管…