自定义函数工具库

一、函数相关

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指定为windowif (obj === undefined || obj === null) {// return fn(...args)obj = window}// 给obj添加一个临时方法, 方法指向的函数就是fnobj.tempFn = Fn;//tempFn内部在执行时this是指向obj的,变相实现了this指向obj这样一个效果// 通过obj来调用这个方法 ==> 也就会执行fn函数 ==> 此时fn中的this肯定为objconst 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));// 151console.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添加一个临时的方法,方法指向的函数就是Fnobj.tempFn = Fn;// 通过obj来调用这个方法 ==> 也就会执行fn函数 ==> 此时fn中的this肯定为objconst 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));// 151console.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与args2return call(fn, obj, ...args, ...args2)}
}

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

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

相关文章

【EI会议|投稿优惠】2024年电力电网与电子通讯国际会议(ICPGEC 2024)

2024 International Conference on Power Grid and Electronic Communication 一、大会信息 会议名称&#xff1a;2024年电力电网与电子通讯国际会议会议简称&#xff1a;ICPGEC 2024收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等会议官网&#xff1a;htt…

git cherry-pick命令使用

git cherry-pick 是一个非常实用的Git命令&#xff0c;它允许你将一个或多个提交从一个分支复制并应用到另一个分支上&#xff0c;而不需要进行整个分支的合并。这对于只想将某些特定更改而非整个分支历史引入当前工作的情况非常有用。以下是使用 git cherry-pick 的基本步骤和…

【训练与预测】02 - 完整的模型验证套路

02 - 完整的模型验证套路 模型图 验证一个模型就是指使用已经训练好的模型&#xff0c;然后给它提供输入。 test.py import torch import torchvision from PIL import Imagedevice torch.device("cuda" if torch.cuda.is_available() else "cpu") ima…

【数据结构】栈(Stack)和队列(Queue)

文章目录 栈一、栈的概念及结构二、栈的特点三、栈的实现1.初始化栈2.判断栈空3.入栈4.出栈5.取栈顶元素6.栈的元素个数7.销毁 队列一、队列的概念及结构二、队列的特点三、队列的实现1.初始化2.入队3.出队4.判断队空5.取队头元素6.取队尾元素 总结 栈 一、栈的概念及结构 栈…

政务热线系统让政府服务更接地气

一、引言 随着社会的快速发展和民众需求的日益增长&#xff0c;政府面临着巨大的挑战。政府需要更好地倾听民众的声音&#xff0c;关注民众的关切&#xff0c;并采取相应的措施回应民众的需求。而政府热线系统作为一种重要的沟通渠道&#xff0c;在提升政府服务质量、增强政府…

HR招聘面试测评,如何判断候选人的创新能力?

创新能力代表着一个人的未来发展潜力&#xff0c;创新能力突出的人&#xff0c;未来的上限就可能更高。而对于一个公司而言&#xff0c;一个具有创新能力的员工&#xff0c;会给公司带来新方案&#xff0c;新思路&#xff0c;对公司的长远发展拥有着十分积极的作用。 而在挑选…

Spark云计算平台Databricks使用,SQL

创建workspace&#xff1a;Spark云计算平台Databricks使用&#xff0c;创建workspace和Compute计算集群&#xff08;Spark集群&#xff09;-CSDN博客 1 创建schema 选择Calalog&#xff0c;点击Create schema 输入名字&#xff0c;Storage location选择workspace&#xff0c;数…

2024年小沙弥小视频,轻松吸引中老年观众,上手简单,轻松月入了万

利用人工智能工具制作小沙弥主题的抖音内容&#xff0c;已成为网络赚钱的新途径。这个项目主要吸引中老年人群体&#xff0c;尤其是对智慧和人生哲理感兴趣的观众。小沙弥以其温馨且启发性的内容&#xff0c;引起中老年用户的共鸣&#xff0c;为他们提供心灵慰藉。 项 目 地 …

AI工具摸索-关于写作(1)

虽然人工智能工具非常多,但是如果想要成为生产力,能达标的工具仍然非常少,除了最常用的chatgpt,其他的工具真的能达标吗,这篇文章主要就是对比市面上的一些工具&#xff0c; 但我这个人非常执拗,我认为作为生产力工具的功能必然是可以真正帮助我们的,而不是说作为一个写作工具结…

leetcode-189 轮转数组

一、题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,…

PINN物理信息网络 | 一种分层归一化物理信息神经网络hnPINN来解决偏微分方程问题附代码

PINN物理信息网络 | 一种分层归一化物理信息神经网络hnPINN来解决偏微分方程问题附matlab代码 分层归一化物理信息神经网络(Hierarchical Normalized Physics-Informed Neural Network,hnPINN)是一种用于求解偏微分方程问题的神经网络方法。 hnPINN结合了分层网络结构和物…

每日资讯阅读

1.今年荔枝自由没了 今年各大平台荔枝比往年高上许多&#xff0c;去年的妃子笑5元/斤,今年30元/斤&#xff0c;简单总结价格大幅上涨的原因和影响。 1.1 原因 暴雨频繁&#xff0c;产量10年新低 国内荔枝产地主要在我国南部的热带、亚热带森林中&#xff0c;福建、两广、海…

leetcode题目80

删除有序数组的重复项 Ⅱ 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间…

Java笔记(其八)--- 方法(函数)

方法 方法&#xff0c;其实就是C语言中的函数&#xff0c;在写作形式上仅有一点点的区别。 修饰词 返回值类型 函数名&#xff08;形参&#xff09;{ ... } 例如 package com.su_de_lei; /*** 写一个两数相加的函数*/ public class FunctionCode {public static void main(St…

【Python时序预测系列】一文搞明白时序数据输入到LSTM模型的格式(案例解读)

这是我的第276篇原创文章。 一、引言 前面我介绍了多个方法实现单变量和多变量时序数据的单站点单步预测&#xff0c;好多小伙伴最近问我这个LSTM模型数据的输入的格式是怎么样的&#xff0c;今天我专门写一篇文章来聊一聊这个问题&#xff0c;希望对大家有所启发和帮助。 二、…

Django3 个人开发笔记

查询函数 select_related 内连接 在 Django ORM 中&#xff0c;select_related 是一个查询性能优化工具&#xff0c;用于解决关联对象的查询效率问题。当你有两个通过外键&#xff08;ForeignKey&#xff09;或一对一字段&#xff08;OneToOneField&#xff09;连接的模型时&…

《青少年成长管理2024》102 “计划执行:计划执行”

《青少年成长管理2024》102 “计划执行&#xff1a;计划执行” 一、执行力的重要性&#xff08;一&#xff09;什么是执行力&#xff08;二&#xff09;执行力对目标的要求&#xff08;三&#xff09;执行力的重要性&#xff08;四&#xff09;执行力的构成 二、影响计划执行的…

PyQt6--Python桌面开发(3.运行QTDesigner生成的ui文件程序)

运行QTDesigner生成的ui文件程序 用QTDesigner设计一个简单的UI 保存ui文件&#xff0c;放到项目里面去 通过pyqt6包里面的uic来加载ui文件 import sysfrom PyQt6.QtWidgets import QApplication from PyQt6 import uicif __name__ __main__:appQApplication(sys.argv)uiui…

C++:多态-虚析构和纯虚析构

虚析构 “虚析构”通常指的是在 C 中的虚析构函数&#xff08;virtual destructor&#xff09;。虚析构函数是一个在基类中声明为虚函数的析构函数。它在派生类中可以被重写&#xff0c;并且当通过基类指针删除派生类对象时&#xff0c;可以确保派生类的析构函数被正确调用。 …

Docker 安装的MySQL迁移数据库

1. 导出数据库 docker ps :查看数据库对应的 CONTAINER ID docker exec -it id /bin/bash : 进入到mysql的docker实例中 cd /usr/bin : 进入到bin目录 mysqldump -u root -p123456 study > /root/study_backup0509.sql :使用mysqldump备份库&#xff0c;注意密码与-p之间…