深入理解 JavaScript 中的绑定机制(上)

news2025/1/14 17:50:54

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 摘要
  • 引言
  • 一、函数调用和`this`关键字🚀
    • 解释常规函数调用中`this`的指向
    • 展示如何通过不同的调用方式影响`this`的指向
  • 二、`bind`方法的使用🎯
    • 介绍`bind`方法的语法和作用
    • 通过示例说明如何使用`bind`来固定`this`的指向

摘要

本文将详细介绍 JavaScript 中的绑定机制,特别是调用、bindapplythis关键字的使用。通过实例演示,帮助读者更好地理解这些概念。🎓

引言

大家好,我是阿珊!在 JavaScript 中,绑定机制是一个重要的概念,它涉及到函数的调用方式以及this关键字的指向。本文将深入探讨绑定机制,包括调用、bindapply的用法以及this关键字的含义。让我们一起来揭开这些神秘面纱吧!💡

一、函数调用和this关键字🚀

解释常规函数调用中this的指向

在常规函数调用中,this的指向通常遵循以下规则:

  1. 如果是普通函数调用,this指向全局对象(window对象,在严格模式下为undefined)。

例如:

function func() {
  console.log(this);
}

func(); // 输出:window(或 undefined,在严格模式下)
  1. 如果是方法调用,this指向调用该方法的对象。

例如:

const obj = {
  func: function() {
    console.log(this);
  }
};

obj.func(); // 输出:obj
  1. 如果是构造函数调用,this指向新创建的对象。

例如:

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

new Person("张三"); // 输出:Person { name: '张三' }
  1. 如果是事件处理函数调用,this通常指向触发事件的元素。

例如:

<button onclick="handleClick()">点击我</button>
<script>
  function handleClick() {
    console.log(this);
  }
</script>

当点击按钮时,handleClick函数会被调用,此时this指向触发事件的按钮元素。

需要注意的是,这些规则并不是绝对的,this的指向还可能受到其他因素的影响,例如使用call()apply()bind()等方法改变this的指向。

展示如何通过不同的调用方式影响this的指向

在 JavaScript 中,this 的指向可以通过不同的调用方式进行改变。下面是一些示例:

  1. 使用call()方法:

call() 方法可以改变函数的this指向。当调用一个函数时,使用call()方法并传入一个对象作为参数,那么函数中的this将指向该对象。

例如:

function func() {
  console.log(this);
}

func.call(obj); // 输出:obj
  1. 使用apply()方法:

apply() 方法与call()方法类似,也是改变函数的this指向。当调用一个函数时,使用apply()方法并传入一个对象作为参数,那么函数中的this将指向该对象。

例如:

function func() {
  console.log(this);
}

func.apply(obj); // 输出:obj
  1. 使用bind()方法:

bind() 方法可以创建一个新函数,该函数的this指向调用bind()方法时传入的对象。

例如:

function func() {
  console.log(this);
}

const newFunc = func.bind(obj);
newFunc(); // 输出:obj
  1. 使用箭头函数:

在箭头函数中,this 的指向与函数所在的作用域保持一致。

例如:

function func() {
  console.log(this);
}

const obj = {
  func: func
};

obj.func(); // 输出:obj

总之,通过使用call()apply()bind()等方法以及箭头函数,可以改变函数的this指向,从而适应不同的场景需求。

二、bind方法的使用🎯

介绍bind方法的语法和作用

bind() 方法是 JavaScript 函数原型上的一个方法,它的作用是创建一个新函数,该函数的上下文(this 的指向)被绑定到调用 bind() 方法的函数实例。

bind() 方法的语法如下:

Function.prototype.bind(context)

其中,context 是需要绑定到新函数的上下文对象。

当调用一个函数时,使用 bind() 方法并传入一个对象作为参数,那么函数中的 this 将指向该对象。

例如:

function func() {
  console.log(this);
}

const obj = {
  func: func
};

obj.func(); // 输出:obj

在上面的示例中,func 函数被绑定到 obj 对象,当调用 obj.func() 时,func 函数中的 this 指向 obj 对象。

bind() 方法常用于实现事件处理函数的绑定、实现柯里化(Currying)等。理解 bind() 方法的原理有助于更好地使用 JavaScript 函数。

通过示例说明如何使用bind来固定this的指向

bind() 方法可以用来固定函数的 this 指向,下面通过一个示例来说明如何使用 bind() 来固定 this 的指向:

const person = {
  name: '张三',
  sayHello: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

const person2 = {
  name: '李四',
  sayHello: person.sayHello
};

person2.sayHello(); // 输出:Hello, my name is 李四

在上面的示例中,我们创建了两个对象 personperson2,它们都有一个 sayHello 方法。当调用 person2.sayHello() 时,输出的名字是 李四,这没有问题。但是,如果我们希望在 person2sayHello 方法中输出 person 的名字 张三,那么可以使用 bind() 方法来固定 this 的指向。

const person = {
  name: '张三',
  sayHello: function() {
    console.log(`Hello, my name is ${this.name}`);
  }
};

const person2 = {
  name: '李四',
  sayHello: person.sayHello.bind(person)
};

person2.sayHello(); // 输出:Hello, my name is 张三

在上面的示例中,我们使用 bind(person) 方法创建了一个新的函数 person2.sayHello,这个新函数的 this 指向 person 对象,因此当调用 person2.sayHello() 时,输出的名字是 张三

通过使用 bind() 方法,我们可以固定函数的 this 指向,从而适应不同的场景需求。

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

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

相关文章

Orange3数据预处理(列选择组件)数据角色及类型描述

在Orange3的文件组件中&#xff0c;datetime、categorical、numeric以及text代表不同种类的数据类型&#xff0c;具体如下&#xff1a; datetime&#xff1a;代表日期和时间类型的数据。通常用于时间序列分析、生存分析和其他需要考虑时间因素的机器学习任务中。例如&#xff0…

k8s-kubeapps部署 20

部署kubeapps应用&#xff0c;为Helm提供web UI界面管理&#xff1a; 下载最新版本的kubeapps并修改其values.yaml文件 下载并拉取所需镜像&#xff1a; 部署应用 添加解析 修改svc暴露方式为LoadBalancer 得到分配地址 访问http://192.168.182.102 授权并获取token 1.24前的…

密码学及其应用(应用篇15)——0/1背包问题

1 问题背景 背包问题是一个经典的优化问题&#xff0c;在计算机科学和运筹学中有着广泛的应用。具体到你提到的这个问题&#xff0c;它是背包问题中的一个特例&#xff0c;通常被称为0/1背包问题。这里&#xff0c;我们有一系列的正整数 &#xff0c;以及一个正整数&#xff0c…

TCP/IP协议栈:模拟器实现基本的L2和L3功能

在C中实现的TCPI/IP网络堆栈模拟器。该模拟器实现基本的第2层&#xff08;MAC地址&#xff0c;Arp&#xff09;和第3层&#xff08;路由&#xff0c;IP&#xff09;功能。 TCP/IP协议栈是一个网络通信的基础架构&#xff0c;包含了多层次的协议和功能。在模拟实现基本的L2和L3…

LabVIEW和Python开发微细车削控制系统

LabVIEW和Python开发微细车削控制系统 为满足现代精密加工的需求&#xff0c;开发了一套基于LabVIEW和Python的微细车削控制系统。该系统通过模块化设计&#xff0c;实现了高精度的加工控制和G代码的自动生成&#xff0c;有效提高了微细车削加工的自动化水平和编程效率。 项目…

【JavaEE】 spring boot的配置文件详解

spring boot的配置文件详解 文章目录 spring boot的配置文件详解常用配置spring boot的配置文件1. properties 文件2. YAML 文件3. 多环境配置4. 配置文件优先级5. 配置属性注入特殊说明 properties配置文件基本语法 例子peoperties文件的缺点 YML配置文件YML使用yml 配置不同数…

【PyQt5桌面应用开发】3.Qt Designer快速入门(控件详解)

一、Qt Designer简介 Qt Designer是PyQt程序UI界面的实现工具&#xff0c;可以帮助我们快速开发 PyQt 程序的速度。它生成的 UI 界面是一个后缀为 .ui 的文件&#xff0c;可以通过 pyiuc 转换为 .py 文件。 Qt Designer工具使用简单&#xff0c;可以通过拖拽和点击完成复杂界面…

mini-spring|向虚拟机注册钩子,实现Bean对象的初始化和销毁方法

目标 当我们的类创建的 Bean 对象&#xff0c;交给 Spring 容器管理以后&#xff0c;这个类对象就可以被赋予更多的使用能力。我们还希望可以在 Bean 初始化过程&#xff0c;执行一些操作。比如帮我们做一些数据的加载执行&#xff0c;链接注册中心暴漏RPC接口以及在Web程序关…

vSphere高可用架构---HA简介

1.高可用性 2.不同级别的高可用&#xff1a; 1&#xff09;应用程序级别&#xff0c;2&#xff09;操作系统级别&#xff0c;3&#xff09;虚拟化级别&#xff0c;4&#xff09;物理层级别 不同级别的高可用举例&#xff1a; 应用程序级别的高可用性。例如&#xff1a;Oracl…

高温应用中GaN HEMT大信号建模的ASM-HEMT

来源&#xff1a;An ASM-HEMT for Large-Signal Modeling of GaN HEMTs in High-Temperature Applications&#xff08;JEDS 23年&#xff09; 摘要 本文报道了一种用于模拟高温环境下氮化镓高电子迁移率晶体管&#xff08;GaN HEMT&#xff09;的温度依赖性ASM-HEMT模型。我…

机器学习.线性回归

斯塔1和2是权重项&#xff0c;斯塔0是偏置项&#xff0c;在训练过程中为了使得训练结果更加精确而做的微调&#xff0c;不是一个大范围的因素&#xff0c;核心影响因素是权重项 为了完成矩阵的运算&#xff0c;在斯塔0后面乘x0&#xff0c;使得满足矩阵的转换&#xff0c;所以在…

UE5 文字游戏(1) 仅UI截图转换为texture2d(适用于window端)

目录 需求 思路 1.截图并读取到本地 2.本地读取图片并转换为纹理2d 效果展示 找了好多的解决办法&#xff0c;都不管用。这个算是折中的。 需求 将当前的用户控件&#xff08;ui&#xff09;截图下来&#xff0c;并赋值到一个texture2d上。 我的需求&#xff1a;文字游戏…

matlab 三质量-弹簧系统受激振力

1、内容简介 略 44-可以交流、咨询、答疑 建立系统运动方程&#xff0c;研究固有频率和对应主振型 2、内容说明 略 三质量&#xff0d;弹簧系统受激振力&#xff0c;并不考虑各自的阻尼。建立系统运动方程。 解&#xff1a;由于阻尼对固有频率没有影响&#xff0c;故本文不…

力扣1290. 二进制链表转整数

Problem: 1290. 二进制链表转整数 文章目录 题目描述思路复杂度Code 题目描述 思路 1.记录一个变量res初始化为0&#xff0c;指针p指向链表头&#xff1b; 2.循环每次res res * 2 p -> val;p p -> next;&#xff08;充分利用二进制数的特性&#xff1b;其中利用指针先…

Camera sensor调试与bringup帧率计算

Camera sensor调试 前言DVP并行接口sensor调试方法硬件调试出图调试错误调试地址无响应问题获取帧缓存失败 DVP Wrapper调试 MIPI 串行差分接口sensor调试方法硬件调试MIPI错误调试PCB设计要求ISP时钟大小要求CSI Controller配置时钟部分其他部分 Sensor HS-PREPARE配置 Camera…

L1、L2、Smooth L1 loss

L1 loss 均绝对误差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09;&#xff0c;公式如下 优点&#xff1a;因为梯度不变&#xff0c;对离群点不敏感 缺点&#xff1a;因为梯度不变&#xff0c;不管是误差小还是大&#xff0c;梯度都一样&#xff0c;不利于模型…

Hikvision SPON IP网络对讲广播系统命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 1.漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视&a…

深入理解Java中的Reader类:一步步剖析

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Android Gradle开发与应用 (二) : Groovy基础语法

1. Groovy是什么 Groovy是基于JVM虚拟机的一种动态语言&#xff0c;语法和Java非常相似&#xff0c;并能够无缝地与Java代码集成和互操作&#xff0c;增加了很多动态类型和灵活的特性。(闭包、DSL) 语法和Java非常相似这个特点&#xff0c;意味着&#xff0c;如果我们完全不懂…

应用配置管理

一、Pod 配置管理 可变配置用 ConfigMap&#xff1b; 敏感信息用 Secret&#xff1b; 身份认证用 ServiceAccount 这几个独立的资源来实现的&#xff1b; 资源配置用 Resources&#xff1b; 安全管控用 SecurityContext&#xff1b; 前置校验用 InitContainers 这几个在 …