当前位置: 首页 > article >正文

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

文章目录

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

1 手写call函数

  • call函数的实现步骤:
    1. 判断调用对象是否为函数。
    2. 判断传入上下文对象是否存在,如果不存在,则设置为window。
    3. 处理传入的参数,截取第一个参数后的所有参数。
    4. 将函数作为上下文对象的一个属性。
    5. 使用上下文对象来调用这个方法,并保存返回结果。
    6. 删除刚才新增的属性。
    7. 返回结果。
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. 返回结果。
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调用,其余情况都传入指定的上下文对象。
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.kler.cn/a/528705.html

相关文章:

  • leetcode——验证二叉搜索树(java)
  • jstat命令详解
  • 新能源算力战争:为什么AI大模型需要绿色数据中心?
  • 【题解】AtCoder Beginner Contest ABC391 D Gravity
  • 索引的底层数据结构、B+树的结构、为什么InnoDB使用B+树而不是B树呢
  • Ruby Dir 类和方法详解
  • matlab快速入门(2)-- 数据处理与可视化
  • 【Redis】Redis修改连接数参数
  • 自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
  • Java小白入门教程:LinkedList
  • 车载以太网---数据链路层
  • Spark SQL读写Hive Table部署
  • SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言
  • 10:预处理
  • C++,vector:动态数组的原理、使用与极致优化
  • 回溯算法理论基础
  • 递归练习七(floodfill 算法)
  • C#属性和字段(访问修饰符)
  • 代码随想录-训练营-day17
  • 自制虚拟机(C/C++)(二、分析引导扇区,虚拟机读二进制文件img软盘)
  • 代码随想录算法训练营第四十二天-动态规划-股票-188.买卖股票的最佳时机IV
  • JVM运行时数据区域-附面试题
  • 笔记:同步电机调试时电角度校正方法说明
  • Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
  • 《逆向工程核心原理》第三~五章知识整理
  • MATLAB实现多种群遗传算法