手写call函数、手写apply函数、手写bind函数

news/2025/2/3 3:09:15/

文章目录

  • 1 手写call函数
  • 2 手写apply函数
  • 3 手写bind函数

1 手写call函数

  • call函数的实现步骤:
    1. 判断调用对象是否为函数。
    2. 判断传入上下文对象是否存在,如果不存在,则设置为window。
    3. 处理传入的参数,截取第一个参数后的所有参数。
    4. 将函数作为上下文对象的一个属性。
    5. 使用上下文对象来调用这个方法,并保存返回结果。
    6. 删除刚才新增的属性。
    7. 返回结果。
javascript">Function.prototype.myCall = function (context) {if(typeof this !== "function") {console.error("type error");}let args = [...arguments].slice(1);let result = null;context = context || window;context.fn = this;result = context.fn(...args);delete context.fn;return result;
};

2 手写apply函数

  • apply函数的实现步骤:
    1. 判断调用对象是否为函数。
    2. 判断传入上下文对象是否存在,如果不存在,则设置为window。
    3. 将函数作为上下文对象的一个属性。
    4. 判断参数值是否传入。
    5. 使用上下文对象来调用这个方法,并保存返回结果。
    6. 删除刚才新增的属性。
    7. 返回结果。
javascript">Function.prototype.myApply = function (context) {if (typeof this !== "function") {throw new TypeError("Error");}let result = null;context = context || window;context.fn = this;if (arguments[1]) {result = context.fn(...arguments[1]);} else {result = context.fn();}delete context.fn;return result;
};

3 手写bind函数

  • bind 函数的实现步骤:
    1. 判断调用对象是否为函数。
    2. 保存当前函数的引用,获取其余传入参数值。
    3. 创建一个函数返回。
    4. 函数内部使用apply来绑定函数调用,需要判断函数作为构造函数的情况,这个时候需要传入当前函数的this给apply调用,其余情况都传入指定的上下文对象。
javascript">Function.prototype.myBind = function (context) {if (typeof this !== "function") {throw new TypeError("Error");}let args = [...arguments].slice(1);let fn = this;return function Fn() {return fn.apply(this instanceof Fn? this: context,args.concat(...arguments));};
};

http://www.ppmy.cn/news/1568849.html

相关文章

记录一次Sqoop从MySQL导入数据到Hive问题的排查经过

个人博客地址:记录一次Sqoop从MySQL导入数据到Hive问题的排查经过 | 一张假钞的真实世界 问题描述 MySQL中原始数据有790W+的记录数,在Sqoop抽取作业成功的情况下在Hive中只有500W左右的记录数。 排查过程 数据导入脚本Log 通过Log可以发现以下信息: 该Sqoop任务被分解…

嵌入式硬件篇---基本组合逻辑电路

文章目录 前言基本逻辑门电路1.与门(AND Gate)2.或门(OR Gate)3.非门(NOT Gate)4.与非门(NAND Gate)5.或非门(NOR Gate)6.异或门(XOR Gate&#x…

高性能消息队列Disruptor

定义一个事件模型 之后创建一个java类来使用这个数据模型。 /* <h1>事件模型工程类&#xff0c;用于生产事件消息</h1> */ no usages public class EventMessageFactory implements EventFactory<EventMessage> { Overridepublic EventMessage newInstance(…

全志 视频输入组件的使用

1.启动MPP和Glog库 示例代码&#xff1a; log_init(argv[0], &stGLogConfig);MPP_SYS_CONF_S stSysConf; memset(&stSysConf, 0, sizeof(MPP_SYS_CONF_S)); stSysConf.nAlignWidth 32; AW_MPI_SYS_SetConf(&stSysConf); ret AW_MPI_SYS_Init();2.获取配置文件信…

物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

物联网&#xff08;IoT&#xff09;‌是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器等装置与技术&#xff0c;实时采集并连接任何需要监控、连接、互动的物体或过程&#xff0c;实现对物品和过程的智能化感知、识别和管理。物联网的核心功能包括数据采集与监…

Git Rebase的使用

Git rebase是Git版本控制系统中的一个重要工具&#xff0c;用于重写提交历史&#xff0c;整合分支。通过rebase&#xff0c;可以使项目历史更加简洁和清晰。本文将深入探讨Git rebase的概念、用途、具体操作及其与其他Git命令的区别。 一、Git Rebase的概念 Git rebase是将一…

基于FPGA的BT656编解码

概述 BT656全称为“ITU-R BT.656-4”或简称“BT656”,是一种用于数字视频传输的接口标准。它规定了数字视频信号的编码方式、传输格式以及接口电气特性。在物理层面上,BT656接口通常包含10根线(在某些应用中可能略有不同,但标准配置为10根)。这些线分别用于传输视频数据、…

包装类(全面解析)

Java中的常用类 含义:直接调用实现一些功能【如:Arrays工具类中的方法】 主要关注常用类中的【以jdk api中的包装类为例】 A、字段摘要(一般只看全局常量,字段名是全大写即常量) B、构造方法摘要(通过看构造方法就能知道此类怎么去创建对象) C、方法摘要(一个方法…