自定义call/apply/bind函数

 这里,我们使用原型方法给 Function 对象添加了 myCall、myApply 和 myBind 方法。 
myCall 和 myApply 非常相似,它们的不同之处在于参数传递方式。 
myCall 函数使用剩余参数语法 ...args 来传递参数,而 myApply 函数接受一个数组作为参数。 
myBind 函数返回一个新的函数,该函数接受一个参数,并将其与 myBind 中传递的参数合并,然后调用原始函数。
对于 myCall 和 myApply,我们首先将传入的 context 参数与 window 对象进行比较,如果 context 是空的,
则默认为全局 window 对象。然后,我们使用 Symbol 函数创建一个唯一的标识符 fnSymbol,并将原始函数存储为 context[fnSymbol] 的属性。
我们然后调用函数,将结果存储在 result 变量中,并使用 delete 关键字从 context 对象中删除函数属性。最后,我们返回函数的结果。
对于 myBind,我们首先将 this 存储在 fn 变量中,然后返回一个新的函数,
该函数使用剩余参数语法将 myBind 中传递的参数与新函数的参数合并,并在新的上下文中使用 apply 调用原始函数。


// 实现 call 方法
Function.prototype.myCall = function (context, ...args) {// 如果 context 参数为空,则默认为 window 对象context = context || window;// 使用 Symbol 函数创建一个唯一的标识符const fnSymbol = Symbol();// 将原始函数存储为 context 对象的属性context[fnSymbol] = this;// 调用函数并将结果存储在 result 变量中const result = context[fnSymbol](...args);// 删除 context 对象的属性delete context[fnSymbol];// 返回函数的结果return result;
};// 实现 apply 方法
Function.prototype.myApply = function (context, args) {// 如果 context 参数为空,则默认为 window 对象context = context || window;// 使用 Symbol 函数创建一个唯一的标识符const fnSymbol = Symbol();// 将原始函数存储为 context 对象的属性context[fnSymbol] = this;// 调用函数并将结果存储在 result 变量中const result = context[fnSymbol](...args);// 删除 context 对象的属性delete context[fnSymbol];// 返回函数的结果return result;
};// 实现 bind 方法
Function.prototype.myBind = function (context, ...args) {// 将 this 存储在 fn 变量中const fn = this;// 返回一个新的函数,该函数将传入的参数与新函数的参数合并,并在新的上下文中使用 apply 调用原始函数return function (...newArgs) {return fn.apply(context, [...args, ...newArgs]);};
};// 测试数据
const obj = {name: 'obj.name',tryCall: function(...arg) {console.log(`Hello, my name is ${this.name},from:${arg}`);},tryApply:function(...args){console.log(`Hello, my name is ${this.name},from:${args}`);},tryBind:function(...args){console.log(`arg[0]:${args[0]},arg[1]:${args[1]}`);}
};
const person = {name: 'person.name'
};
// obj.tryCall('obj'); 
// obj.tryCall.call(person,'call');
// obj.tryCall.myCall(person,'mycall'); // obj.tryApply('obj','aaa'); 
// obj.tryApply.apply(person,['apply','aaa']); 
// obj.tryApply.myApply(person,['myapply','bbb']);const oldBind = obj.tryBind.bind(person);
oldBind('London','UK'); 
const newBind = obj.tryBind.myBind(person);
newBind('London','UK'); 

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

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

相关文章

maven的scop作用域依赖问题导致idea社区版报错

1. 错误:代码没改,卸了专业版后改用社区版出现以下报错 2024-01-08 16:34:29.374 ERROR [main] org.springframework.boot.SpringApplication.reportFailure:823 Application run failed java.lang.IllegalStateException: Error processing condition …

计算机找不到vcomp140.dll怎样修复?马上教会你修复dll问题

在计算机系统运行过程中,遭遇“vcomp140.dll丢失”的场景并不少见,这一问题的出现往往伴随着软件无法正常启动、运行时错误提示或者系统性能下降等现象。具体场景可能包括但不限于:用户在尝试打开某个依赖于Visual C Redistributable库的应用…

数据在AI图像修复任务中的核心作用

在人工智能(AI)领域,数据的重要性不言而喻。尤其在图像修复任务中,数据的精度和质量直接影响着AI模型的性能。图像修复是指利用AI技术自动识别图像中的缺陷或遮挡物,并对其进行修复或还原的过程。这项技术广泛应用于各…

基于pyradiomics影像组学特征提取

基于pyradiomics影像组学特征提取 特征提取:1 pyradiomics的使用:1.1,在python环境下安装pyradiomics:1.2,设置特征提取器,获得想要特征:1.2.1 图像类型1.2.2 目标特征设置1.2.3 特征提取器设置 2 代码示例;参考&#…

【web服务搭建实验】之nginx基础学习

目录 一、nginx的简介二、nginx安装实验虚拟主机的配置web服务器的主流实现方式-LAMP和LNMP 一、nginx的简介 Nginx是一款轻量级HTTP服务器,同时也是代理邮箱服务器,具备反向代理,通用代理的功能。支持多个系统,和不同操作系统。…

秒杀系统如何设计

秒杀系统主要有以下特点 1、高并发瞬时流量 2、热点数据 3、数据量大 4、库存的正确扣减 5、黄牛抢购 6、重复下单 7、对普通交易的影响 前后端缓存 首先是秒杀功能的开启,以及前端资源的访问,这部分内容一般都是提前放到CDN中,让这些静态…

图机器学习年度汇集

一、深度学习模型优化 在图机器学习领域,深度学习模型的优化尤为重要。今年的主要进展包括了利用先进的优化算法提高模型精度、减少训练时间以及对大规模图数据的适应性。部分团队还推出了定制化的深度学习模型,特别适用于复杂的图形结构和交互。 二、…

【算法】Java-二叉树的右视图(BFS、DFS两种解法)

题目要求: 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入…

e2studio开发三轴加速度计LIS2DW12(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…

Jetpack Compose -> 声明式UI Modifier

前言 本章主要介绍下 Compose 的声明式 UI 以及初级写法&#xff1b; 什么是声明式UI 传统UI 传统 UI 方式来声明UI <androidx.appcompat.widget.LinearLayoutCompat android:layout_width"match_parent" android:layout_height"match_parent&quo…

Pytorch中的标准维度顺序

在PyTorch中&#xff0c;如果一个张量包括通道数&#xff08;C&#xff09;、宽度&#xff08;W&#xff09;、高度&#xff08;H&#xff09;和批量大小&#xff08;N&#xff09;&#xff0c;那么它的标准维度顺序是 [N, C, H, W]&#xff0c;即&#xff1a; 第一个维度 N 是…

test Property-based Testing-04-junit-quickcheck

拓展阅读 开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) 开源 Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) junit-quickcheck&#xff1a;基于 JUnit 风格的属性驱动测试库 junit-qu…

送水小程序开发:如何选择最适合的技术平台

选择最适合的技术平台对于开发送水小程序至关重要。在这篇文章中&#xff0c;我将为您介绍如何选择最适合的技术平台来开发送水小程序&#xff0c;以及各种技术平台的优缺点。无论您是刚刚起步的创业公司还是成熟的送水服务提供商&#xff0c;本文都将为您提供有关送水小程序开…

深信服超融合HCI版本升级,6.0.0R5升级至6.8.0R2

超融合升级&#xff0c;需要满足以下条件及前期准备&#xff1a; 确认HCI的升级序列号有效升级时长大概在一个半小时&#xff0c;安全起见&#xff0c;需预留至少三至四小时窗口期升级前&#xff0c;需要将所有虚拟机关机&#xff0c;涉及到业务无法访问&#xff0c;需提前通知…

六、K8S-DaemonSet(DS)

DaemonSet&#xff1a;简称DS&#xff0c;守护进程控制器 DS的主要作用&#xff0c;是在kubernetes集群里&#xff0c;运行一个daemon pod。DS只管理POD 对象&#xff0c;然后通过nodeAffinity和Toleration这两个调度器的小功能&#xff0c;保证每个节点上有且只有一个pod。 特…

网络-DHCP中继(思科)

思科 前提&#xff1a;将R1 R3配置16板卡 将R1更改标识符为三层交换机 将R3更改标识符为交换机 拓扑图&#xff1a; R2进行配置 配置IP地址 为12.0.0.2 配置默认路由到R1的f1/4接口 配置dhcp地址池 配置vlan10的地址池 配置vlan20的地址池 三层交换机R1进行配置 将f1/4接口…

高光谱分类论文解读分享之基于形态卷积神经网络的高光谱影像分类

IEEE TGRS 2021&#xff1a;基于形态卷积神经网络的高光谱影像分类 题目 Morphological Convolutional Neural Networks for Hyperspectral Image Classification 作者 Swalpa Kumar Roy; Ranjan Mondal; Mercedes E. Paoletti; Juan M. Haut; Antonio Plaza 关键词 Clas…

关于git与git-lfs对文件压缩存储方面的研究

先说结论&#xff0c;git使用了Delta增量压缩算法&#xff0c;git-lfs实测没有进行任何压缩&#xff0c;这个结论让我很震惊。 测试过程如下&#xff1a; 测试git仓库自身的压缩 准备一个包含许多杂项文件的文件夹&#xff0c;大概几百M&#xff0c;要保证有一个txt文本文件…

require vs import,深入了解JavaScript模块引入方式,应用场景剖析

JavaScript作为一种脚本语言&#xff0c;经过多年的发展已经成为Web开发的主要语言之一。随着项目的复杂性增加&#xff0c;对于代码组织和管理的需求也日益迫切。这促使了JavaScript模块系统的不断发展。 背景 JavaScript模块系统的发展背景 在早期&#xff0c;JavaScript并…

Qt框架学习 --- CTK编译(Qt5.15.2+vs2019+cmake)

系列文章目录 第二章 CTK的测试demo https://blog.csdn.net/yonug1107716573/article/details/135527289 文章目录 系列文章目录前言一、准备工作二、编译步骤1.修改文件2.编译CTK2.1 准备2.2 cmake界面配置2.3 配置编译器2.4 编译的配置设置2.5 选择需要编译的模块2.6 生成2.…