JavaScript系列(12)-- 高阶函数应用

JavaScript高阶函数应用 🚀

今天,让我们深入探讨JavaScript中的高阶函数应用。高阶函数是函数式编程的重要组成部分,掌握它们的应用可以让我们的代码更加优雅和灵活。

高阶函数概述 🌟

💡 小知识:高阶函数是指接受函数作为参数和/或返回函数作为结果的函数。在JavaScript中,函数是"一等公民",这使得高阶函数成为一种强大的编程工具。

常用高阶函数详解 📊

// 1. Array.prototype的高阶函数
function arrayHigherOrderFunctions() {
    const numbers = [1, 2, 3, 4, 5];
    
    // map: 转换数组元素
    const doubled = numbers.map(n => n * 2);
    console.log(doubled); // [2, 4, 6, 8, 10]
    
    // filter: 过滤数组元素
    const evens = numbers.filter(n => n % 2 === 0);
    console.log(evens); // [2, 4]
    
    // reduce: 累积计算
    const sum = numbers.reduce((acc, curr) => acc + curr, 0);
    console.log(sum); // 15
    
    // some: 检查是否存在满足条件的元素
    const hasEven = numbers.some(n => n % 2 === 0);
    console.log(hasEven); // true
    
    // every: 检查是否所有元素都满足条件
    const allPositive = numbers.every(n => n > 0);
    console.log(allPositive); // true
    
    // find: 查找第一个满足条件的元素
    const firstEven = numbers.find(n => n % 2 === 0);
    console.log(firstEven); // 2
    
    // findIndex: 查找第一个满足条件的元素的索引
    const firstEvenIndex = numbers.findIndex(n => n % 2 === 0);
    console.log(firstEvenIndex); // 1
}

// 2. 自定义高阶函数
function customHigherOrderFunctions() {
    // 函数组合
    const compose = (...fns) => x => 
        fns.reduceRight((acc, fn) => fn(acc), x);
    
    // 函数管道
    const pipe = (...fns) => x => 
        fns.reduce((acc, fn) => fn(acc), x);
    
    // 函数记忆化
    const memoize = fn => {
        const cache = new Map();
        return (...args) => {
            const key = JSON.stringify(args);
            if (cache.has(key)) return cache.get(key);
            const result = fn.apply(this, args);
            cache.set(key, result);
            return result;
        };
    };
    
    // 函数节流
    const throttle = (fn, delay) => {
        let lastCall = 0;
        return function (...args) {
            const now = Date.now();
            if (now - lastCall >= delay) {
                lastCall = now;
                return fn.apply(this, args);
            }
        };
    };
    
    // 函数防抖
    const debounce = (fn, delay) => {
        let timeoutId;
        return function (...args) {
            clearTimeout(timeoutId);
            timeoutId = setTimeout(() => fn.apply(this, args), delay);
        };
    };
}

// 3. 高阶函数链式调用
class FunctionalChain {
    constructor(value) {
        this.value = value;
    }
    
    static of(value) {
        return new FunctionalChain(value);
    }
    
    map(fn) {
        return FunctionalChain.of(fn(this.value));
    }
    
    tap(fn) {
        fn(this.value);
        return this;
    }
    
    chain(fn) {
        return fn(this.value);
    }
    
    value() {
        return this.value;
    }
}

高阶函数的实际应用 💼

让我们看看高阶函数在实际开发中的一些应用场景:

// 1. 数据处理管道
class DataProcessor {
    static createPipeline(...transformers) {
        return data => transformers.reduce(
            (acc, transformer) => transformer(acc), 
            data
        );
    }
    
    // 数据过滤器
    static filter(predicate) {
        return data => data.filter(predicate);
    }
    
    // 数据映射器
    static map(transformer) {
        return data => data.map(transformer);
    }
    
    // 数据分组器
    static groupBy(keySelector) {
        return data => data.reduce((groups, item) => {
            const key = keySelector(item);
            (groups[key] = groups[key] || []).push(item);
            return groups;
        }, {});
    }
    
    // 使用示例
    static processUserData(users) {
        const pipeline = this.createPipeline(
            this.filter(user => user.age >= 18),
            this.map(user => ({
                ...user,
                fullName: `${user.firstName} ${user.lastName}`
            })),
            this.groupBy(user => user.country)
        );
        
        return pipeline(users);
    }
}

// 2. 事件处理系统
class EventSystem {
    constructor() {
        this.handlers = new Map();
    }
    
    // 事件处理器装饰器
    static decorate(handler, ...decorators) {
        return decorators.reduce(
            (acc, decorator) => decorator(acc),
            handler
        );
    }
    
    // 日志装饰器
    static withLogging(handler) {
        return (...args) => {
            console.log('Event handled with args:', args);
            const result = handler(...args);
            console.log('Event handling result:', result);
            return result;
        };
    }
    
    // 错误处理装饰器
    static withErrorHandling(handler) {
        return (...args) => {
            try {
                return handler(...args);
            } catch (error) {
                console.error('Error in event handler:', error);
                throw error;
            }
        };
    }
    
    // 性能监控装饰器
    static withPerformanceMonitoring(handler) {
        return (...args) => {
            const start = performance.now();
            const result = handler(...args);
            const end = performance.now();
            console.log(`Handler took ${end - start}ms`);
            return result;
        };
    }
}

// 3. 中间件系统
class MiddlewareSystem {
    constructor() {
        this.middlewares = [];
    }
    
    // 添加中间件
    use(middleware) {
        this.middlewares.push(middleware);
        return this;
    }
    
    // 执行中间件链
    execute(initialContext) {
        return this.middlewares.reduce(
            (promise, middleware) => promise.then(middleware),
            Promise.resolve(initialContext)
        );
    }
    
    // 中间件组合
    static compose(...middlewares) {
        return context => middlewares.reduce(
            (promise, middleware) => promise.then(middleware),
            Promise.resolve(context)
        );
    }
}

高阶函数的性能优化 ⚡

处理高阶函数时的性能优化技巧:

// 1. 缓存优化
class CacheOptimizer {
    // 高级缓存策略
    static createCachedFunction(fn, { 
        maxSize = 100, 
        ttl = 3600000 
    } = {}) {
        const cache = new Map();
        const timestamps = new Map();
        
        return (...args) => {
            const key = JSON.stringify(args);
            const now = Date.now();
            
            // 清理过期缓存
            if (timestamps.has(key)) {
                const timestamp = timestamps.get(key);
                if (now - timestamp > ttl) {
                    cache.delete(key);
                    timestamps.delete(key);
                }
            }
            
            // 缓存命中
            if (cache.has(key)) {
                return cache.get(key);
            }
            
            // 缓存大小控制
            if (cache.size >= maxSize) {
                const oldestKey = timestamps.keys().next().value;
                cache.delete(oldestKey);
                timestamps.delete(oldestKey);
            }
            
            // 计算新值
            const result = fn(...args);
            cache.set(key, result);
            timestamps.set(key, now);
            return result;
        };
    }
}

// 2. 执行优化
class ExecutionOptimizer {
    // 批量处理优化
    static batchProcess(fn, batchSize = 1000) {
        return async function(items) {
            const results = [];
            for (let i = 0; i < items.length; i += batchSize) {
                const batch = items.slice(i, i + batchSize);
                const batchResults = await Promise.all(
                    batch.map(item => fn(item))
                );
                results.push(...batchResults);
            }
            return results;
        };
    }
    
    // 并发控制
    static withConcurrencyLimit(fn, limit = 5) {
        const queue = [];
        let activeCount = 0;
        
        const processQueue = async () => {
            if (activeCount >= limit || queue.length === 0) return;
            
            activeCount++;
            const { args, resolve, reject } = queue.shift();
            
            try {
                const result = await fn(...args);
                resolve(result);
            } catch (error) {
                reject(error);
            } finally {
                activeCount--;
                processQueue();
            }
        };
        
        return (...args) => new Promise((resolve, reject) => {
            queue.push({ args, resolve, reject });
            processQueue();
        });
    }
}

// 3. 内存优化
class MemoryOptimizer {
    // 惰性计算优化
    static createLazyFunction(fn) {
        let computed = false;
        let result;
        
        return (...args) => {
            if (!computed) {
                result = fn(...args);
                computed = true;
            }
            return result;
        };
    }
    
    // 内存泄漏防护
    static createSafeFunction(fn) {
        const weakRefs = new WeakMap();
        
        return (...args) => {
            const safeArgs = args.map(arg => {
                if (typeof arg === 'object' && arg !== null) {
                    if (!weakRefs.has(arg)) {
                        weakRefs.set(arg, new WeakRef(arg));
                    }
                    return weakRefs.get(arg).deref();
                }
                return arg;
            });
            
            return fn(...safeArgs);
        };
    }
}

最佳实践建议 💡

  1. 高阶函数设计模式
// 1. 装饰器模式
function decoratorPattern() {
    // 创建装饰器
    const withLogging = fn => (...args) => {
        console.log('Calling with args:', args);
        const result = fn(...args);
        console.log('Returned:', result);
        return result;
    };
    
    const withTiming = fn => (...args) => {
        const start = performance.now();
        const result = fn(...args);
        const end = performance.now();
        console.log(`Execution time: ${end - start}ms`);
        return result;
    };
    
    const withRetry = (fn, retries = 3) => async (...args) => {
        for (let i = 0; i < retries; i++) {
            try {
                return await fn(...args);
            } catch (error) {
                if (i === retries - 1) throw error;
                console.log(`Retry ${i + 1}/${retries}`);
            }
        }
    };
}

// 2. 策略模式
function strategyPattern() {
    const strategies = new Map();
    
    // 注册策略
    const registerStrategy = (name, fn) => strategies.set(name, fn);
    
    // 执行策略
    const executeStrategy = (name, ...args) => {
        const strategy = strategies.get(name);
        if (!strategy) throw new Error(`Strategy ${name} not found`);
        return strategy(...args);
    };
    
    // 组合策略
    const composeStrategies = (...names) => (...args) =>
        names.reduce((result, name) => 
            executeStrategy(name, result), 
            args
        );
}

// 3. 观察者模式
function observerPattern() {
    class Observable {
        constructor() {
            this.observers = new Set();
        }
        
        subscribe(observer) {
            this.observers.add(observer);
            return () => this.observers.delete(observer);
        }
        
        notify(data) {
            this.observers.forEach(observer => observer(data));
        }
        
        pipe(...operators) {
            return operators.reduce(
                (obs, operator) => operator(obs),
                this
            );
        }
    }
}

结语 📝

高阶函数是JavaScript中非常强大的特性,它们能帮助我们写出更加模块化和可复用的代码。我们学习了:

  1. 常用的高阶函数及其应用
  2. 自定义高阶函数的实现
  3. 实际应用场景
  4. 性能优化技巧
  5. 最佳实践和设计模式

💡 学习建议:在使用高阶函数时,要注意平衡抽象程度和代码可读性。过度使用高阶函数可能会使代码难以理解和维护。同时,要注意性能影响,合理使用缓存和优化策略。


如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

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

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

相关文章

C语言 扫雷程序设计

目录 1.main函数 2.菜单打印menu函数 3.游戏game函数 4.宏定义 5.界面初始化 6.打印界面 7.设置雷 8.统计排查坐标周围雷的个数 9.排查雷 10.总代码 test.c代码 game.h代码 game.c代码 结语&#xff1a; 一个简单的扫雷游戏&#xff0c;通过宏定义可以修改行列的…

如何有效搭建在线培训知识库

在当今快速发展的教育行业&#xff0c;知识的更新速度日益加快&#xff0c;教育机构和企业需要为学员提供持续的学习资源和培训支持。在线培训知识库的搭建成为实现这一目标的重要手段。一个有效的在线培训知识库不仅能够帮助学员系统地学习和掌握知识&#xff0c;还能为教师和…

Android Audio基础(54)——数字音频接口 I2S、PCM(TDM) 、PDM

1. 概述 本文介绍的数字音频接口全部是硬件接口,是实际的物理连线方式,即同一个PCB板上IC芯片和IC芯片之间的通讯协议。 PCM、PDM也可以用于表示音频编码格式,。编码格式是指模拟信号数字化的方式。 I2S和PCM(TDM)接口传输的数据是PCM格式的音频数据。这两种协议是最为常见…

STM32之CAN通讯(十一)

STM32F407 系列文章 - CAN通讯&#xff08;十一&#xff09; 目录 前言 一、CAN 二、CAN驱动电路 三、CAN软件设计 1.CAN状态初始化 2.头文件相关定义 3.接收中断服务函数 4.用户层使用 1.用户层相关定义 2.发送数据 3.接收数据 1.查询方式处理 2.中断方式处理 3…

第31天:Web开发-PHP应用TP框架MVC模型路由访问模版渲染安全写法版本漏洞

#知识点 1、安全开发-框架技术-ThinkPHP 2、安全开发-框架安全-版本&写法 3、安全开发-ThinkPHP-代码审计案例 类别 组件/框架 说明 [Web框架] Laravel 现代化、功能全面的框架&#xff0c;适合大多数Web应用。 Symfony 高度模块化、功能强大的框架&#xff0c;适…

量子计算遇上人工智能:突破算力瓶颈的关键?

引言&#xff1a;量子计算遇上人工智能——突破算力瓶颈的关键&#xff1f; 在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正以前所未有的速度改变着我们的生活&#xff0c;从语音助手到自动驾驶&#xff0c;从医学诊断到金融分析&#xff0c;无不彰显其…

英伟达 RTX 5090 显卡赋能医疗大模型:变革、挑战与展望

一、英伟达 RTX 5090 与 RTX 4090 技术参数对比 1.1 核心架构与制程工艺 在探讨英伟达 RTX 4090 与 RTX 5090 的差异时&#xff0c;核心架构与制程工艺无疑是最为关键的基础要素&#xff0c;它们从根本上决定了两款显卡的性能上限与应用潜力。 1.1.1 核心架构差异 RTX 4090…

Bash Shell的操作环境

目录 1、路径与指令搜寻顺序 2、bash的进站&#xff08;开机&#xff09;与欢迎信息&#xff1a;/etc/issue&#xff0c;/etc/motd &#xff08;1&#xff09;/etc/issue &#xff08;2&#xff09;/etc/motd 3、bash的环境配置文件 &#xff08;1&#xff09;login与non-…

homework 2025.01.07 math 6

1选择部分 二填空部分

(六)CAN总线通讯

文章目录 CAN总线回环测试第一种基于板载CAN测试第一步确认板载是否支持第二步关闭 CAN 接口将 CAN 接口置于非活动状态第三步 配置 CAN 接口第一步 设置 CAN 接口比特率第二步 设置 CAN 启用回环模式第三步 启用 CAN 接口 第四步 测试CAN总线回环捕获 CAN 消息发送 CAN 消息 第…

任务调度之Quartz(二):Quartz体系结构

1、Quartz 体系结构 由上一篇的Quartz基本使用可以发现&#xff0c;Quartz 主要包含一下几种角色&#xff1a; 1&#xff09;Job&#xff1a;也可以认为是JobDtetail&#xff0c;表示具体的调度任务 2&#xff09;Trigger&#xff1a;触发器&#xff0c;用于定义任务Job出发执行…

基于Springboot + vue实现的小型养老院管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

初学Linux电源管理

学习文档出处&#xff1a; 万字整理 | 深入理解Linux电源管理&#xff1a;万字整理 | 深入理解Linux电源管理-CSDN博客 电源管理 因为设备需要用电&#xff0c;而且设备中的各个硬件所需要的电压是不一样的。故计算机需要对硬件的电源状态管理。但是电能并不是免费的&#x…

React(二)——Admin主页/Orders页面/Category页面

文章目录 项目地址一、侧边栏1.1 具体实现 二、Header2.1 实现 三、Orders页面3.1 分页和搜索3.2 点击箭头显示商家所有订单3.3 页码按钮以及分页 四、Category页面4.1 左侧商品添加栏目4.2 右侧商品上传栏 五、Sellers页面六、Payment Request 页面&#xff08;百万数据加载&a…

刚体变换矩阵的逆

刚体运动中的变换矩阵为&#xff1a; 求得变换矩阵的逆矩阵为&#xff1a; opencv应用 cv::Mat R; cv::Mat t;R.t(), -R.t()*t

IDEA中Maven依赖包导入失败报红的潜在原因

在上网试了别人的八个问题总结之后依然没有解决&#xff1a; IDEA中Maven依赖包导入失败报红问题总结最有效8种解决方案_idea导入依赖还是报红-CSDN博客https://blog.csdn.net/qq_43705131/article/details/106165960 江郎才尽之后突然想到一个原因&#xff1a;<dep…

UVM:uvm_component methods configure

topic UVM component base class uvm_config_db 建议使用uvm_config_db代替uvm_resource_db uvm factory sv interface 建议&#xff1a;uvm_config_db 以下了解 建议打印error

基于时间维度水平拆分的多 TiDB 集群统一数据路由/联邦查询技术的实践

导读 在大数据时代&#xff0c;金融行业面临着日益增长的数据量和复杂的查询需求&#xff0c;尤其是跨库、跨集群的场景。在这种背景下&#xff0c;如何在保证数据一致性、高可用性的同时&#xff0c;实现业务的快速扩展与高效查询&#xff0c;成为了企业数字化转型的关键挑战…

概率论 期末 笔记

第一章 随机事件及其概率 利用“四大公式”求事件概率 加法公式 减法 条件概率公式 全概率公式与贝叶斯公式 伯努利概型求概率 习题 推导 一维随机变量及其分布 离散型随机变量&#xff08;R.V&#xff09;求分布律 利用常见离散型分布求概率 连续型R.V相关计算 利用常见连续…