JS中 bind()的用法,call(),apply(),bind()异同点及使用,如何手写一个bind()

✨什么是bind()

bind()的MDN地址

bind() 方法创建一个新函数,当调用该新函数时,它会调用原始函数并将其 this 关键字设置为给定的值,同时,还可以传入一系列指定的参数,这些参数会插入到调用新函数时传入的参数的前面。

🍧 call(),apply(),bind()的异同

🎐 相同点

三者都是动态的修改函数内部的this指向

🎶 不同点

  • 传参方式不同,call()和bind()是按照顺序传参,apply()是通过数组/伪数组传参。
  • 执行机制不同,call()和apply()是立即执行函数,bind()不会立即执行函数,而是会返回一个修改过this的新函数。

🍿 call()

函数名.call(修改后的this,形参1,形参2…)

    person = {name: 'zhangsan'}function fn (a, b,) {console.log(this) //{name: 'zhangsan'}console.log(a, b) //1 2 console.log(a + b) //3}//call 立即执行函数 没有返回值let res = fn.call(person, 1, 2)console.log(res); //undefined

在这里插入图片描述

🎄apply()

函数名.apply(修改后的this,数组/伪数组)

    person = {name: 'zhangsan'}function fn (a, b) {console.log(this) //{name: 'zhangsan'}console.log(a, b) //1 2 console.log(a + b) //3}//apply 立即执行函数 没有返回值let res = fn.apply(person, [1, 2])console.log(res) //undefined

在这里插入图片描述

🎡 bind()

函数名.bind(修改后的this,形参1,形参2…)

  person = {name: 'zhangsan'}function fn (a, b, c, d) {console.log(this) //{name: 'zhangsan'}console.log(a, b, c, d) //1 2 3 4console.log(a + b + c + d) //10}//bind 不会立即执行函数,而是返回一个修改this的新函数let newFn = fn.bind(person, 1, 2)newFn(3, 4)

在这里插入图片描述

✨ 手写bind() :myBind()

可参照上一篇文章 手写call()

🎡代码

Function.prototype.myBind = function (thisArg, ...args) {return (...reArgs) => {// this:原函数(原函数.myBind)return this.call(thisArg, ...args, ...reArgs)}}// ------------- 测试代码 -------------const person = {name: 'zhangsan'}function func(numA, numB, numC, numD) {console.log(this)console.log(numA, numB, numC, numD)return numA + numB + numC + numD}const bindFunc = func.myBind(person, 1, 2)const res = bindFunc(3, 4)console.log('返回值:', res)

🎉 测试

在这里插入图片描述

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

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

相关文章

ElasticSearch第二讲:ES详解 - ElasticSearch基础概念

ElasticSearch第二讲:ES详解 - ElasticSearch基础概念 在学习ElasticSearch之前,先简单了解下ES流行度,使用背景,以及相关概念等。本文是ElasticSearch第二讲,ElasticSearch的基础概念。 文章目录 ElasticSearch第二讲…

G. The Morning Star

Problem - G - Codeforces 思路:想了挺长时间的,一直没想到一个简便的方法在瞎搞。我们发现对于某个点来说,其他的点如果能够跟他匹配,那么一定在这8个方向上,而同时这8个方向其实对应这4条直线,假设点为(x…

云服务器与内网穿透有什么区别?哪个好用?

云服务器与内网穿透有什么区别,哪个好用?如何在自己公网IP云主机上部署搭建P2P穿透?这里给大家汇总介绍一下,供大家共同学习了解。 云服务器的一些特点: 需要数据上云场景时,通常可以选择使用云服务器。 …

Yarn资源调度器

文章目录 一、Yarn资源调度器1、架构2、Yarn工作机制3、HDFS、YARN、MR关系4、作业提交之HDFS&MapReduce 二、Yarn调度器和调度算法1、先进先出调度器(FIFO)2、容量调度器(Capacity Scheduler)3、公平调度器(Fair …

[Rust GUI]0.10.0版本iced代码示例 - progress_bar

-1 字体支持 iced0.10.0 仅支持指定系统内置字体(iced默认字体中文会乱码) iced0.10.0 手动加载字体的功能已经砍了,想手动加载就用0.9.0版本,文档0.9.0版本 想显示中文则需要运行在一个自带字体的Windows系统上。而且这个字体最好不要钱。 (Windows闲着…

PyCharm集成开发环境安装、启动与设置

作为非开发工程师职业,大家多多少少都会对编程有抵触,其实没有必要对Python有太大的“戒心" ,把Python当做你的一个工具就可以了。——扎克伯格 一、Python的定义: Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python的设计具有…

Edge官方鼠标手势

前言 日期:2023年8月 Edge浏览器目前已自带官方的鼠标手势功能,若要使用首先将浏览器更新至最新版,下文介绍使用方法。 官方鼠标手势 前提 更新Edge至最新版,并关闭其它鼠标手势扩展。 开启鼠标手势 打开Edge浏览器的设置&…

技术分析需谨慎,各位投资者应该这样做

技术市场分析中存在许多工具,其中之一便是烛台模式。然而对于这些模式和指标,FPmarkets澳福和各位投资者应持谨慎的态度,因为它们仅仅展示了一种可能的结果,而无法确保其绝对准确。 关于蜡烛图交易的提示,包括Maruboz…

反转字符串 反转字符串 || 反转字符串 |||

思想总结:首先将字符串转变为字符数组,再进行遍历并反转字符。 1.反转字符串 代码: class Solution {public void reverseString(char[] s) {reverse(s,0,s.length); //左闭右开}public static void reverse(char[] ch,int i,int j) { 翻转函…

springboot之二:整合junit进行单元测试+整合redis(本机、远程)+整合mybatis

资源地址: 整合junit的代码:https://download.csdn.net/download/zhiaidaidai/88291527 整合redis的代码:https://download.csdn.net/download/zhiaidaidai/88291536 整合mybatis的代码:https://download.csdn.net/download/zh…

DGA行为转变引发了对网络安全的担忧

Akamai的研究人员发现,在域名系统(DNS)流量数据中,动态种子域生成算法(DGA)家族的行为发生了令人担忧的变化。这一发现揭示了恶意行为者如何调整他们的策略来延长他们的指挥与控制(C2)通信通道的寿命,以保护他们的僵尸网络。 从技术角度来看…

云数据库知识学习——云数据库产品、云数据库系统架构

一、云数据库产品 1.1、云数据库厂商概述 云数据库供应商主要分为三类。 ① 传统的数据库厂商,如 Teradata、Oracle、IBM DB2 和 Microsoft SQL Server 等。 ② 涉足数据库市场的云供应商,如 Amazon、Google、Yahoo!、阿里、百度、腾讯…

【Linux】编辑器 vim

1、vim的基本概念 vi/vim【一款文本编辑器】vim【一款多模式编辑器】vi/vim 的区别简单点来说,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮&#xff0…

linux 网络接口的子接口的配置

参考: https://blog.csdn.net/baidu_38803985/article/details/104653205 在 Linux 中,网络接口通常以ethX的形式命名,其中X代表接口的编号,例如eth0代表第一个网络接口,eth1代表第二个,依此类推。虚拟子接…

【PyQT5教程】-02-UI组件

1.按钮 QtWidgets模块提供了多种按钮类,让你可以轻松地创建各种类型的按钮 1.1 QPushButton(普通按钮) QPushButton是PyQt5中最常见的按钮类型之一,用于触发动作或执行操作。通过信号与槽机制,你可以将按钮的点击事…

day37 线程

一、线程安全 二、多线程并发的安全问题 当多个线程并发操作同一临界资源 由于线程切换实际不确定 导致操作顺序出现混乱 产生的程序bug 严重时出现系统瘫痪 临界资源 :操作该资源的完整流程同一时间只能被单一线程操作的资源 多线程并发会出现的各种问题、 如…

Serverless Framework 亚马逊云(AWS)中国地区部署指南

Serverless Framework 亚马逊云(AWS)中国地区部署指南 Serverless Framework 亚马逊云(AWS)中国地区部署指南 前言前置准备 1. 账号的注册2. 全局安装 serverless3. 设置你的系统环境变量4. 设置部署凭证 快速部署一个 hello world 创建入口函数 index.js event 参数context 参…

推荐一款新的自动化测试框架:DrissionPage

今天给大家推荐一款基于Python的网页自动化工具:DrissionPage。这款工具既能控制浏览器,也能收发数据包,甚至能把两者合而为一,简单来说:集合了WEB浏览器自动化的便利性和 requests 的高效率优点。 一、DrissionPage框…

查看创建好的数据库

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 语法格式: show create database 数据库名称; 案列:查看testing数据库信息 mysql> show create database testing; ------------------------…

4.2 Ioc容器加载过程-Bean的生命周期深度剖析

Bean生命周期详解 第一步拿到父类BeanFactory子类 第二步,读取配置类 AnnotatedBeanDefinitionReader 用来读取配置类之外和还做了 第一个是解析类的处理器,没有的话我们的配置类就无法解析 总结this()无参构造函数里面实现了【三大步】 实例…