什么是高阶函数

简介: 什么是高阶函数

名称:什么是高阶函数


目录:

一、介绍

二、高阶函数的本质

二、高阶函数的本质

字数:大约600字

一、介绍


高阶函数:看上去很高大上的样子,其实也很简单,只需要满足以下两个条件中任何一个即可。


第一个条件:函数作为函数的参数。


第二个条件:返回一个函数。


听上去,这个高阶函数离我们很远很远,其实不是,你其实每天都在用高阶函数,甚至可以说,你每个js文件都用到高阶函数。


例如以函数作为参数:


const arr = [1,2,3,4,5];
arr.map(item => item + 10)
arr.filter(item => item % 2 === 0)
numbers.reduce((accumulator, currentValue) => accumulator + currentValue);
setTimeout(() => {

}, timeout);

dom.addEventListener('click', () => {

})

例如以函数作为返回值:


function a(){
  

}
const b = a.bind({})

那为什么js要有高阶函数,其实如果js没有高阶函数,那真是不知道该怎么写了,上面的方法都不能那样写。


二、高阶函数的本质


那到底js高阶函数有什么用呢。这个问题其实涉及到高阶函数的本质。在函数式编程里面,他把每一个函数看作是一个运算,它认为函数的本质就是运算,给我一些就给你算出一些东西,而高阶函数表达是什么呢,表达的是运算的缺失和延续,怎么理解,我们先来看缺失。


我们来看看这个map,当你自己去写一个map函数的时候,你会怎么写呢,我的目标是返回一个数组,遍历原数组,经过一套规矩,转换成新的值,把新的值,放到新的数组里,它的基本逻辑就是这样。


function map() {
  
const result = [];
for (let i = 0; i < 愿数组.length; i++) {
愿数组[i] --> 新的值
result.push(新的值)
}
}

但是你仔细想想,在上面代码,是不是有个拼图是缺失的,什么拼图,就是


愿数组[i] --> 新的值

这里需要一个运算,把原数组里面的值通过一定的运算,转换成新的值,我在写这个函数的时候,缺失了一个运算,而这个运算,本质上就是一个函数,你需要给我传进来,把这个拼图补上,


function map(fn) {
  
const result = [];
for (let i = 0; i < 愿数组.length; i++) {
const 新的值 = fn(愿数组[i])
result.push(新的值)
}
}

所以,如果函数作为参数进来,那么就意味着这个方法有个运算的缺失,需要用高阶函数来表达。


而另一方面,你写一个bind函数。


function bind(thisArg) {
  
const fn = 绑定了this的函数,
return fn;
}

这个bind函数,只负责生成这个函数,但是这个函数在什么时候运行,我不知道,也可以现在调用,也可以将来某个时候运行,都不清楚,那怎么办呢,那就把这个函数返回.


用的人,拿到这个返回值,就拿到这个函数,将来他在任何时候都可以调用这个函数,实际上调用的是bind函数里面的功能。也就是,虽然bind执行完啦,但是没有结束,他的功能会延续到外层,在将来的某个时候发挥作用,这个就是运算的延续。


三、总结


我们在运算缺失的时候,需要函数作为参数,我们需要对运算作为延续的时候,需要函数作为返回值。


虽然在js里面可以看见各种高阶函数,但是底层逻辑都是一样的。


学习了高阶函数,很多时候你可以又用不到,为什么这么说呢,因为一般代码都是出现在公共代码里面,都是中高级开发者封装好的方法。


相关文章
|
自然语言处理 数据可视化 算法
第5章 数据可视化——5.4 四维图形可视化
第5章 数据可视化——5.4 四维图形可视化
|
Java Maven
maven依赖原则以及jar包冲突
该文介绍了Maven依赖原则:最短路径优先,申明顺序优先和覆写优先。当有冲突时,Maven选择路径最短的版本,按POM中声明顺序加载,并且子POM的依赖优先于父POM。解决冲突最佳方式是通过`mvn dependency:tree`检查依赖树并调整POM文件中的坐标顺序。
627 2
|
Java 数据安全/隐私保护 Docker
Docker Desktop 启动报错 Unexpected WSL error 问题解决
Docker Desktop 启动报错 Unexpected WSL error 问题解决
1362 0
|
9月前
|
JSON 监控 供应链
京东商品详情API:从签名生成到JSON解析的完整实战指南
京东商品详情API是京东开放平台的核心接口,提供实时、准确的商品信息获取服务。支持查询商品基础信息、价格库存、SKU规格及销量评价等120+字段,数据延迟≤30秒,单次最多查询200个SKU,适用于价格监控、库存管理等场景。采用HTTP/HTTPS请求,返回标准化JSON格式,便于集成,助力电商数据高效采集与应用。
|
缓存 监控 前端开发
如何监控浏览器缓存的命中率?
如何监控浏览器缓存的命中率?
703 57
|
9月前
|
数据可视化 数据挖掘 Java
基于大数据的短视频流量数据分析与可视化
本文探讨短视频流量数据分析与可视化管理系统的研究背景、意义及现状,分析其在现代信息化管理中的重要性。针对传统管理模式效率低、监管缺失等问题,结合Java、Hadoop、Scrapy、MySQL和SpringBoot等技术,设计并实现一套高效、智能的系统方案,推动短视频行业管理向网络化、智能化转型。
|
人工智能 Java 数据库
飞算 JavaAI:革新电商订单系统 Spring Boot 微服务开发
在电商订单系统开发中,传统方式耗时约30天,需应对复杂代码、调试与测试。飞算JavaAI作为一款AI代码生成工具,专注于简化Spring Boot微服务开发。它能根据业务需求自动生成RESTful API、数据库交互及事务管理代码,将开发时间缩短至1小时,效率提升80%。通过减少样板代码编写,提供规范且准确的代码,飞算JavaAI显著降低了开发成本,为软件开发带来革新动力。
|
Cloud Native Serverless 开发者
Bolt.diy 一键部署体验:开启创意建站新旅程
今天我来给大家分享一下我最近折腾的有趣玩意儿——Bolt.diy!这玩意儿可真是个宝藏,简直就是创意建站的超强辅助。
438 17
|
vr&ar 开发者 C++
游戏开发丨基于Panda3D的迷宫小球游戏
游戏开发丨基于Panda3D的迷宫小球游戏
872 4