JavaScript高级:改变this的方法

JavaScript 中的 this 关键字在不同情境下可能会指向不同的对象,这常常让人感到困惑。但别担心,我们有一些方法可以显式地改变 this 的指向,从而更好地控制代码的行为。本文将详细介绍如何改变 this 的方法,让你轻松驾驭这一重要概念。

1. 使用 call 方法

call 方法允许你调用一个函数并显式地指定函数内部的 this 指向。

function greet(name) {console.log(`Hello, ${name}! I am ${this.name}.`);
}const person = { name: 'Alice' };greet.call(person, 'Bob'); // 输出:Hello, Bob! I am Alice.

2. 使用 apply 方法

apply 方法与 call 类似,但接受一个数组作为参数。

function sum(a, b) {console.log(a + b + this.value);
}const data = { value: 10 };sum.apply(data, [5, 7]); // 输出:22

3. 使用 bind 方法

bind 方法创建一个新函数,其 this 值被绑定到指定的对象。

function greet(message) {console.log(`${message}, ${this.name}!`);
}const person = { name: 'Alice' };
const greetPerson = greet.bind(person);greetPerson('Hello'); // 输出:Hello, Alice!

4. 使用箭头函数

箭头函数的 this 值在定义时确定,它会捕获外层函数的 this 值。

const person = {name: 'Alice',greet: function() {setTimeout(() => {console.log(`Hello, ${this.name}!`);}, 1000);}
};person.greet(); // 一秒后输出:Hello, Alice!

5. 使用 call 或 apply 实现继承

可以使用 callapply 在一个对象的上下文中调用另一个函数,并实现继承。

function Animal(name) {this.name = name;
}function Dog(name, breed) {Animal.call(this, name);this.breed = breed;
}const myDog = new Dog('Buddy', 'Golden Retriever');
console.log(myDog.name);  // 输出:Buddy
console.log(myDog.breed); // 输出:Golden Retriever

6. 使用 this 的备份

在某些情况下,将 this 的引用备份到另一个变量中,以避免内部函数改变 this 的指向。

function myFunction() {const self = this;setTimeout(function() {console.log(self.name);}, 1000);
}const person = { name: 'Alice' };
myFunction.call(person); // 一秒后输出:Alice

在 JavaScript 中,通过 callapplybind 方法以及箭头函数,我们可以显式地改变 this 的指向,从而更好地控制代码的行为。这些方法在不同的情境下能够为你带来灵活性和便利性。理解和掌握这些方法,你将能够更加自如地操作 this,编写出更加可读和可维护的代码。不管你是刚入门还是有一定经验的开发者,通过学习这些方法,你都能够在 JavaScript 的世界中更加游刃有余,创造出令人瞩目的应用!

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

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

相关文章

【数据结构OJ题】移除元素

原题链接:https://leetcode.cn/problems/remove-element/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 方法一:暴力删除,挪动数据覆盖。即遍历整个nums[ ]数组,遇到值等于val的元素,就将整…

python pandas 获取Excel文件下所有的sheet名称,表格数据

方法1: 一定要加sheet_nameNone,才能读取出所有的sheet,否则默认读取第一个sheet,且获取到的keys是第一行的值 df pd.read_excel(自己的Excel文件路径.xlsx, sheet_nameNone) # 路径注意转义 for i in df.keys():print(i)方法…

JVM工作的总体机制概述

JDK、JRE、JVM关系回顾 JVM:Java Virtual Machine,翻译过来是Java虚拟机JRE:Java Runtime Environment,翻译过来是Java运行时环境 JREJVMJava程序运行时所需要的类库JDK:Java Development Kits,翻译过来是…

电脑怎么查看连接过的WIFI密码(测试环境win11,win10也能用)

电脑怎么查看连接过的WIFI密码 方法一:适用于正在连接的WIFI密码的查看 打开设置 点击“网络和Internet”,在下面找到“高级网络设置”点进去 在下面找到 “更多网络适配器选项” 点进去 找到 WLAN ,然后双击它 5.然后点击“无线属性” 6.…

WPS的excel表格单元格拖动数字日期等 不自增原因

对着表格中的每个单元格右下角,在变成下图,黑十字后,拖动这个十字.就会在右侧出现一个小窗口. 里面菜单中可以选择按序数增加 但是,如果拖动,发现小窗口菜单不出现.说明这一栏开启了筛选功能.清空筛选条件后,即可恢复自增功能.

Element-ui中分页器的使用

<template>中写&#xff1a; js中写&#xff1a;

Linux 和 MacOS 中的 profile 文件详解(一)

什么是 profile 文件&#xff1f; profile 文件是 Linux、MacOS 等&#xff08;unix、类 unix 系统&#xff09;系统中的一种配置文件&#xff0c;主要用于设置系统和用户的环境变量。 在 shell 中&#xff0c;可以通过执行 profile 文件来设置用户的环境变量。shell 有两种运…

大模型的数据隐私问题有解了,浙江大学提出联邦大语言模型

作者 | 小戏、Python 理想化的 Learning 的理论方法作用于现实世界总会面临着诸多挑战&#xff0c;从模型部署到模型压缩&#xff0c;从数据的可获取性到数据的隐私问题。而面对着公共领域数据的稀缺性以及私有领域的数据隐私问题&#xff0c;联邦学习&#xff08;Federated Le…

jvm-程序计数器

1、是什么 4 学习路线 类加载器 内存结构方法区 类堆 对象虚拟机栈程序计数器本地方法栈 执行引擎解释器编译器 热点代码 5 程序计数器–作用 java源代码编译蛏二进制字节码 jvm指令。 对所有平台保持一致性。记住下一条jvm指令的执行地址。寄存器&#xff0c;cpu中读取速度…

关于安卓jar包修改并且重新发布

背景&#xff1a; 对于某些jar包&#xff0c;其内部是存在bug的&#xff0c;解决的方法无外乎就有以下几种方法&#xff1a; &#xff08;1&#xff09;通过反射&#xff0c;修改其赋值逻辑 &#xff08;2&#xff09;通过继承&#xff0c;重写其方法 &#xff08;3&#xff0…

卡巴斯基为基于Linux的嵌入式设备推出专用解决方案

导读卡巴斯基在其卡巴斯基嵌入式系统安全产品中引入了对 Linux 的支持。这种适应性强的多层解决方案现在为基于Linux的嵌入式系统、设备和场景提供优化的安全&#xff0c;合通常适用于这些系统的严格监管标准。 卡巴斯基在其卡巴斯基嵌入式系统安全产品中引入了对 Linux 的支持…

js-7:javascript原型、原型链及其特点

1、原型 JavaScript常被描述为一种基于原型的语言-每个对象拥有一个原型对象。 当试图访问一个对象的属性时&#xff0c;它不仅仅在该对象上搜寻&#xff0c;还会搜寻该对象的原型&#xff0c;以及该对象的原型的原型&#xff0c;依次层层向上搜索&#xff0c;直到找到一个名字…

Oracle 开发篇+Java通过HiKariCP访问Oracle数据库

标签&#xff1a;HikariCP、数据库连接池、JDBC连接池、释义&#xff1a;HikariCP 是一个高性能的 JDBC 连接池组件&#xff0c;号称性能最好的后起之秀&#xff0c;是一个基于BoneCP做了不少的改进和优化的高性能JDBC连接池。 ★ Java代码 import java.sql.Connection; impor…

品牌渠道控价常见问题有哪些

不管是哪个品牌在做控价时&#xff0c;会遇到的问题都是相通的&#xff0c;如果筛选低价、窜货链接&#xff0c;如何去治理这些链接&#xff0c;使其下架&#xff0c;或者是改价。也会有品牌需要针对渠道中的乱价问题进行提前预警或者规避&#xff0c;这些可以通过分析电商数据…

Chatgpt API调用报错:openai.error.RateLimitError

Chatgpt API 调用报错&#xff1a; openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing details. 调用OpenAI API接口 import openai import osopenai.api_key os.getenv("OPENAI_API_KEY")result openai.Chat…

linux onlyOffice docker 离线部署

文章目录 前言1. 安装Docker容器2. 拉取镜像3. 验证 前言 docker 离线安装onlyoffice&#xff0c;如在线安装可直接跳过导出导入镜像步骤&#xff0c;拉取后直接运行。 1. 安装Docker容器 下载文件 wget https://download.docker.com/linux/static/stable/x86_64/docker-19…

竞赛项目 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x…

文盘Rust -- Mutex解决并发写文件乱序问题 | 京东云技术团队

在实际开发过程中&#xff0c;我们可能会遇到并发写文件的场景&#xff0c;如果处理不当很可能出现文件内容乱序问题。下面我们通过一个示例程序描述这一过程并给出解决该问题的方法。 use std::{fs::{self, File, OpenOptions},io::{Write},sync::Arc,time::{SystemTime, UNI…

如何使用html,包括css,js 画思维导图?有哪些可用的方法?

首先&#xff0c;创建一个新的HTML文件&#xff0c;可以使用任何文本编辑器。在文件中添加必要的标签和结构来定义网页的内容和布局。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>Mind Map</title><link re…

python中字符串内建函数之find / rfind 、index / rindex的区别

一、find(str, beg, end)/index(str, beg, end) 从左到右查找某个符号在字符串中第一次出现的位置&#xff0c;返回正向下标(从字符串左边开始查询字符串匹配到的第一个索引) 二、rfind(str, beg, end)/rindex(str, beg, end) 从右到左查找某个符号第一次出现的位置&#xff0c…