自定义函数工具库

一、函数相关

call()& apply()& bind()

API说明

  • call()
    • 语法: call(fn, obj, ...args)
    • 功能: 执行fn, 使this为obj, 并将后面的n个参数传给fn(功能等同于函数对象的call方法)
  • apply()
    • 语法: apply(fn, obj, args)
    • 功能: 执行fn, 使this为obj, 并将args数组中的元素传给fn(功能等同于函数对象的apply方法)
  • bind()
    • 语法: bind(fn, obj, ...args)
    • 功能: 给fn绑定this为obj, 并指定参数为后面的n个参数 (功能等同于函数对象的bind方法)

实现说明

  • 区别call()/apply()/bind()
    • call(obj)/apply(obj): 调用函数, 指定函数中的this为第一个参数的值
    • bind(obj): 返回一个新的函数, 新函数内部会调用原来的函数, 且this为bind()指定的第一参数的值
    • 注意: 如果obj是null/undefined, this为window
  • 应用
    • call()/apply()应用: 根据伪数组生成真数组
    • bind(): react中组件的自定义方法 / vue中的事件回调函数内部
  • 自定义call()/apply()
    • 给obj添加一个临时方法, 方法名任意, 值为当前函数
    • 通过obj调用这个临时方法, 并将接收的参数传入
    • 删除obj上的这个临时方法属性
  • 自定义实现bind()
    • 返回一个新函数
    • 在新函数内部通过原函数对象的call方法来执行原函数
    • 指定原函数的this为obj
    • 指定参数为bind调用的参数和后面新函数调用的参数

1、自定义函数对象的call方法

call.js 

/*
自定义函数对象的call方法
Fn:要执行的函数
obj:函数运行时this指向的对象
args:函数运行时的参数
*/
function call(Fn, obj, ...args) {
    // 如果obj是undefined/null, this指定为window
    if (obj === undefined || obj === null) {
        // return fn(...args)
        obj = window
    }
    // 给obj添加一个临时方法, 方法指向的函数就是fn
    obj.tempFn = Fn;//tempFn内部在执行时this是指向obj的,变相实现了this指向obj这样一个效果
    // 通过obj来调用这个方法 ==> 也就会执行fn函数 ==> 此时fn中的this肯定为obj
    const result = obj.tempFn(...args);
    // 删除obj上的临时方法
    delete obj.tempFn;
    // 返回fn执行的结果
    return result;
}
<!DOCTYPE html>
<html lang="en">

<head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="css/style.css" rel="stylesheet">
    <script src="./call.js"></script>
</head>

<body>

    <script>
        // 声明一个函数
        function add(a, b) {
            return a + b + this.c;
        }
        // 声明一个对象
        let obj = {
            c: 521
        }
        //添加全局属性
        window.c = 1314;
        // 执行call函数
        console.log(call(add, obj, 10, 20));// 151
         console.log(call(add, null, 30, 40));// 1384
    </script>
</body>

</html>

2、自定义函数对象的apply方法

/*
自定义函数对象的Apply方法
Fn:要执行的函数
obj:函数运行时this指向的对象
args:函数运行时的参数
*/
// 改变this的指向,执行函数,返回结果
function apply(Fn, obj, ...args) {
    if (obj === undefined || obj === null) {
        obj = window;
    }
    //给obj添加一个临时的方法,方法指向的函数就是Fn
    obj.tempFn = Fn;
    // 通过obj来调用这个方法 ==> 也就会执行fn函数 ==> 此时fn中的this肯定为obj
    const result = obj.tempFn(...args)
    // 删除obj上的临时方法
    delete obj.tempFn
    // 返回fn执行的结果
    return resultv
}
<!DOCTYPE html>
<html lang="en">

<head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="css/style.css" rel="stylesheet">
    <script src="./call.js"></script>
</head>

<body>

    <script>
        // 声明一个函数
        function add(a, b) {
            return a + b + this.c;
        }
        // 声明一个对象
        let obj = {
            c: 521
        }
        //添加全局属性
        window.c = 1314;
        // 执行call函数
        console.log(apply(add, obj, 10, 20));// 151
        console.log(apply(add, null, 30, 40));// 1384
    </script>
</body>

</html>

3、自定义函数对象的bind方法

import {call} from './call'
/* 
  自定义函数对象的bind方法
*/
export function bind(fn, obj, ...args) {
  console.log('bind()')
  // 返回一个新函数
  return (... args2) => {
    // 通过call调用原函数, 并指定this为obj, 实参为args与args2
    return call(fn, obj, ...args, ...args2)
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ti雷达CFG阅读技巧

Ti雷达CFG阅读技巧 使用TI雷达测量数据前&#xff0c;需要考虑不同的设计参数之间的区别&#xff0c;虽然Ti雷达的说明文档非常清晰&#xff0c;直接查询mmwave_sdk_user_guide文档就可以了&#xff0c;但是用的多了&#xff0c;参数都知道可能是什么含义&#xff0c;来回查询…

Springboot集成Mybatispuls操作mysql数据库-04

MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强而不做改变。它支持所有MyBatis原生的特性&#xff0c;因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。MyBatis-Plus旨在简化开发、提高效率&#xff0c;…

商务分析方法与工具(七):Python的趣味快捷-异常处理结构

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

布局全球内容生态,酷开科技Coolita AIOS以硬核品质亮相

当前&#xff0c;全球产业链供应链格局持续重构&#xff0c;成为影响中国对外经济发展的重要因素。2024年4月15至5月5日&#xff0c;历史久、规模大、层次高&#xff0c;作为中国外贸风向标的第135届中国进出口商品交易会&#xff08;即广交会&#xff09;在美丽的广州隆重举行…

matlab打开文件对话框

在使用matlab GUI制作时&#xff0c;为了便于用户交互使用&#xff0c;经常设置文件打开对话框&#xff0c;让用户根据实际需要选择打开的文件。下面以打开一张图片为例&#xff0c;matlab代码如下&#xff1a; [temp_filepath,temp_filename]uigetfile(*.jpg,请选择要打开的图…

探秘Tailwind CSS:前端开发的加速器(TailwindCSS让CSS编写更简洁)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Tailwind CSS 📒📝 快速体验📝 深入学习⚓️ 相关链接 ⚓️📖 介绍 📖 在这个快速迭代的互联网时代,前端开发效率和设计质量的双重要求,使得开发者们不断寻求更高效的工具和方法。今天,我们要介绍的是一个能够极大…

如何在Python中调用系统命令或执行外部程序?详细教程来了!

基本原理 在Python中执行程序或调用系统命令是一项非常实用的技能&#xff0c;这允许Python脚本与操作系统进行交互&#xff0c;执行各种外部程序。Python提供了多种方法来实现这一功能&#xff0c;包括os.system(), subprocess模块等。 示例代码 示例1&#xff1a;使用os.s…

LLM生态下爬虫程序的现状与未来

最近出现一批与LLM有关的新的爬虫框架&#xff0c;一类是为LLM提供内容抓取解析的&#xff0c;比如 Jina Reader 和 FireCrawl &#xff0c;可以将抓取的网页解析为markdown这样的对LLM友好的内容&#xff0c;例如markdown&#xff0c;这类本质上还是传统的爬虫解决方案。还有一…

[C++] const 成员函数

标题&#xff1a;[C] this指针 & const 成员函数 水墨不写bug 正文开始&#xff1a; 目录 &#xff08;一&#xff09;Cpp的面向对象编程 &#xff08;二&#xff09;this指针 &#xff08;三&#xff09;const修饰的成员函数 在正式讲解const修饰成员函数之前&#x…

在做题中学习(55):一维前缀和模板

【模板】前缀和_牛客题霸_牛客网 (nowcoder.com) 题目解释&#xff1a; 注意&#xff1a;下标从1开始的。 l 和 r就是对这n个整数去取一个区间&#xff0c;例如示例一&#xff1a; (1,2) 区间 就是算出1 2 4 中 1&#xff0c;2下标对应值的和&#xff0c;12 3 同理,(2,3) …

vscode正则匹配技巧

写正则表达式 下面是匹配加粗的单词或空格 \*\*[a-zA-Z\s]*\*\*vscode提取加粗的内容 altenter&#xff0c;再ctrlC复制选中的内容出来

前端 | iframe框架标签应用(三)| 点击指定部分,进行外部页面搜索,内置iframe返回搜索结果

文章目录 &#x1f4da;实现效果&#x1f4da;模块实现解析 &#x1f4da;实现效果 点击单词列表内的任意单词↓ 弹出对应单词的搜狗翻译搜索结果&#xff0c;点击关闭按钮关闭界面。 &#x1f4da;模块实现解析 在列表框搜索功能的基础上加一个click触发效果就好了&#xf…

网络安全在数字时代的重要性:以近期网络安全事件为镜

在当今这个信息化爆炸的时代&#xff0c;互联网如同一张无形的网&#xff0c;将我们的生活、工作、学习紧密相连。然而&#xff0c;这张网在带来便捷的同时&#xff0c;也暗藏着无数的安全隐患。近年来&#xff0c;网络安全事件频发&#xff0c;从个人隐私泄露到企业数据被盗&a…

网站未部署证书有何影响,如何解决?

如果您的网站没有ssl证书会有以下风险 1 浏览器标记为不安全 未安装证书的网站在访问时会有不安全的提示弹窗或者在网址栏直接显示不安全 2 影响企业信誉 当用户访问网站时看到不安全提示&#xff0c;会对网站的真实性和安全性产生怀疑&#xff0c;不敢轻易与该企业合作&…

【NodeMCU实时天气时钟温湿度项目 2】WIFI模式设置及连接

第一专题内容&#xff0c;请参考 【NodeMCU实时天气时钟温湿度项目 1】连接点亮SPI-TFT屏幕和UI布局设计-CSDN博客 第三专题内容&#xff0c;请参考 【NodeMCU实时天气时钟温湿度项目 3】连接SHT30传感器&#xff0c;获取并显示当前环境温湿度数据&#…

初探 JUC 并发编程:独占锁 ReentrantLock 底层源码解析

本篇是关于 JUC 并发包中独占锁 ReentrantLock 底层源码的解析&#xff0c;在阅读之前需要对 AQS 抽象队列有基本的了解。 文章目录 1.1 类图结构1.2 获取锁1&#xff09;void lock() 方法2&#xff09;void lockInterruptibly() 方法3&#xff09;boolean tryLock() 方法4&am…

(✌)粤嵌—2024/5/10—删除链表的倒数第 N 个结点

代码实现&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* removeNthFromEnd(struct ListNode *head, int n) {if (head NULL || n 0) {return head;}int i n;struct ListNode …

MySQL·复合查询

目录 基本查询回顾 案例1&#xff1a;查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J 案例2&#xff1a;按照部门号升序而雇员的工资降序排序 案例3&#xff1a;使用年薪进行降序排序 案例4&#xff1a;显示工资最高的员工的名字…

TPI 系列——1W,3KVDC隔离 定电压输入,稳压双路输出DC-DC模块电源

TPI系列产品是专门针对PCB上需要与输入电源隔离的电源应用场合而设计的。该产品适用于&#xff1a;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之间要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压稳定和输出纹波噪声要求高.

多商户Docker Supervisor进程管理器部署

Dockerfile 根目录下没有Dockerfile的可以复制下面的命令 # 使用基础镜像 FROM leekay0218/crmeb-mer## 复制代码 ## 在本地调试注释掉&#xff0c;使用映射把文件映射进去 #ADD ./ /var/www# 设置工作目录 WORKDIR /var/www# 设置时区为上海 ENV TZAsia/Shanghai RUN ln -sn…
最新文章