js设计模式基础篇(四)之高阶函数

2023-11-09

高阶函数

高阶函数是指至少满足下列条件之一的函数:

  1. 函数可以作为参数被传递。
  2. 函数可以作为返回值输出。

函数作为参数传递 

     把函数当作参数传递,这代表我们可以抽离出一部分容易变化的业务逻辑,把这部分业务逻辑放在函数参数中,这样一来可以分离业务代码中变化与不变的部分。其中一个重要应用场景就是常见的回调函数。

1. 回调函数

  在 ajax 异步请求的应用中,回调函数的使用非常频繁

var getUserInfo = function( userId, callback ){ 
   $.ajax( 'http://xxx.com/getUserInfo?' +  userId, function( data ){ 
      if ( typeof callback === 'function' ){ 
           callback( data ); 
      } 
   }); 
} 
getUserInfo( 13157, function( data ){ 
   alert ( data.userName ); 
}); 

     回调函数的应用不仅只在异步请求中,当一个函数不适合执行一些请求时,我们也可以把这些请求封装成一个函数,并把它作为参数传递给另外一个函数,“委托”给另外一个函数来执行。

     比如,我们想在页面中创建 100 个 div 节点,然后把这些 div 节点都设置为隐藏。下面是一种编写代码的方式:

var appendDiv = function(){ 
  for (var i = 0; i < 100; i++ ){ 
     var div = document.createElement( 'div' ); 
     div.innerHTML = i; 
     document.body.appendChild( div ); 
     div.style.display = 'none; 
  } 
}; 
appendDiv(); 

    把 div.style.display = 'none'的逻辑硬编码在 appendDiv 里显然是不合理的,appendDiv 未免有点个性化,成为了一个难以复用的函数,于是我们把 div.style.display = 'none'这行代码抽出来,用回调函数的形式传入 appendDiv方法:

var appendDiv = function( callback ){ 
    for ( var i = 0; i < 100; i++ ){ 
       var div = document.createElement( 'div' ); 
       div.innerHTML = i; 
       document.body.appendChild( div ); 
       if ( typeof callbaback === 'function' ){ 
            callback( div ); 
       } 
    } 
}; 
appendDiv(function( node ){ 
     node.style.display = 'none'; 
}); 

    可以看到,隐藏节点的请求实际上是由客户发起的,但是客户并不知道节点什么时候会创建好,于是把隐藏节点的逻辑放在回调函数中,“委托”给 appendDiv 方法。appendDiv 方法当然知道节点什么时候创建好,所以在节点创建好的时候,appendDiv 会执行之前客户传入的回调函数。

2. Array.prototype.sort

    Array.prototype.sort 接受一个函数当作参数,这个函数里面封装了数组元素的排序规则。从Array.prototype.sort 的使用可以看到,我们的目的是对数组进行排序,这是不变的部分;而使用什么规则去排序,则是可变的部分。把可变的部分封装在函数参数里,动态传入Array.prototype.sort,使 Array.prototype.sort 方法成为了一个非常灵活的方法,代码如下:

   // 从小到大排列

  [ 1, 4, 3 ].sort( function( a, b ){ 
        return a - b; 
  }); 
//   输出: [ 1, 3, 4 ] 

//从大到小排列
[ 1, 4, 3 ].sort( function( a, b ){ 
    return b - a; 
}); 
// 输出: [ 4, 3, 1 ] 

 

函数作为返回值输出

    相比把函数当作参数传递,函数当作返回值输出的应用场景也许更多,也更能体现函数式编程的巧妙。让函数继续返回一个可执行的函数,意味着运算过程是可延续的。

1. 判断数据的类型

var isType = function( type ){ 
    re
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js设计模式基础篇(四)之高阶函数 的相关文章

  • Java面向对象-继承

    Java继承的概念与实现 继承是Java面向对象编程技术的一块基石 xff0c 因为它允许创建分等级层次的类 继承是类与类之间的关系 xff0c 是一个很简单很直观的概念 xff0c 与现实世界中的继承 xff08 例如儿子继承父亲财产 x
  • 如何理解面向对象编程(OOP)

    想要理解OOP 首先需要清楚什么是对象 所谓对象就是由一组数据结构和处理它们的方法组成的 划重点 数据 包括对象的特性 状态等的静态信息 方法 也就是行为 包括该对象的对数据的操作 功能等能动信息 把相同行为的对象归纳为类 类是一个抽象的概
  • Python基础入门笔记(一)

    前言 认识Python 既然学习 Python 那么至少得了解下这门语言 知道 Python 代码执行过程吧 Python 的历史有兴趣的百度百科下就有 这个不多说了 1 我们先来了解下什么是解释型语言和编译型语言 计算机是不能够识别高级语
  • Javascript设计模式-07-观察者模式(发布订阅模式)

    Javascript设计模式 07 观察者模式 发布订阅模式 简介 观察者模式又叫发布订阅模式 他定义了一种一对多的关系 让多个观察者对象同时监听某一个主体对象 这个主体对象发生改变时就会通知所有观察者 使得他们能够自动更新自己 提供一种抽
  • 编程思想:面向对象和面向过程

    何谓面向对象 何谓面向过程 对于这编程界的两大思想 一直贯穿在我们学习和工作当中 我们知道面向过程和面向对象 但要让我们讲出来个所以然 又感觉是不知从何说起 最后可能也只会说出一句就是那样啦 你知道啦 而这种茫然 其实就是对这两大编程思想的
  • 【Java基础篇

    个人主页 兜里有颗棉花糖 欢迎 点赞 收藏 留言 加关注 本文由 兜里有颗棉花糖 原创 收录于专栏 JavaSE primary 本专栏旨在分享学习JavaSE的一点学习心得 欢迎大家在评论区讨论 目录 一 什么是多态 二 多态的实现条件
  • 【JavaSe】面向对象篇(十四) 异常

    JavaSe 面向对象篇 十四 异常 1 异常 1 1 异常概念 异常 就是不正常的意思 在生活中 医生说 你的身体某个部位有异常 该部位和正常相比有点不同 该部位的功能将受影响 在程序中的意思就是 异常 指的是程序在执行过程中 出现的非正
  • Linux内核调度框架和CFS调度算法

    进程调度 暂时以2 6 24内核版本讲解 该版本是CFS调度器注入Linux内核之后的第二个版本 在框架和数据结构上与4 x之后没有本质上的区别 但是由于4 x对CFS调度做了很大的优化 代码量暴增10倍之多 故不容易把握算法与框架的本质
  • 【Java基础篇

    个人主页 兜里有颗棉花糖 欢迎 点赞 收藏 留言 加关注 本文由 兜里有颗棉花糖 原创 收录于专栏 JavaSE primary 本专栏旨在分享学习JavaSE的一点学习心得 欢迎大家在评论区讨论 继承允许一个类继承另一个类的属性和方法 并
  • 趣解面向对象

    小白自述 过去就听说 到面向对象的时候即使没有女朋友 都可以new好多个 啥时候我也能想new多少new多少 面向对象听了很多老师的课 感觉好绕啊 这个类套那个类 怎么套的也是一头雾水 怎么才能学好了面向对象嘛 好多人都说面向对象是java
  • 什么是面向对象编程?

    所有编程语言都提供抽象机制 汇编是语言是对底层机器的轻微抽象 命令式语言 FORTRAN BASIC C 是对底层机器的轻微抽象 他们所做的主要抽象仍然要求在解决问题基于计算机的结构 而不是所要解决问题的结构 程序员必须建立起机器模型和待解
  • Java基础-面向对象

    Java基础 面向对象 由于年前工作太忙 实在没时间整理Java基本知识 但是可能长时间不更新不好看 再说我个人也没有半途而废的习惯 所以决定节前还是更新一篇吧 这也算是Java的基本思想和一些偏进阶的东西 如果思考透彻了 理解清楚了 那么
  • 面向对象-- 属性查找顺序以及绑定方法

    面向对象编程思想的本质就是将数据和功能绑定在一起 对象本质是容器 其将数据和功能整合在一起 所以在Python中 一切皆对象 对象 数据与功能的结合体 类 种类 相当于诸多对象共有的特征 数据 功能 类只描述对象公共的特征 不同的特征由对象
  • 面向对象:类的概念和定义!

    面向对象的概念 对象 Object 含有 物体 的概念 一切皆物体 对象 对象由静态的属性和动态的行为组成 属性 行为 存储 保温 类 一组具有相同属性和行为的对象的抽象 杯子 车 不管白猫黑猫 抓到老鼠就是好猫 这句话中存在两个对象 白猫
  • 设计模式(一) 工厂方法模式

    介绍 关于设计模式 大家可能已经有很多了解了 因此这里直接开始吧 首先来介绍一下工厂方法模式 它是一种创建型模式 在设计模式 可复用面向对象软件的基础中对工厂方法由如下的解释 工厂方法模式的实质是 定义一个创建对象的接口 但让实现这个接口的
  • Integer.valueOf()方法 java

    Integer valueOf 方法实现如下 public static Integer valueOf int i final int offset 128 if i gt 128 i lt 127 must cache return I
  • Javascript设计模式-04-工厂模式

    Javascript设计模式 04 工厂模式 简单工厂 抽象工厂 简介 工厂模式定义一个用于创建对象的接口 这个接口由子类决定实例化哪一个类 该模式使一个类的实例化延迟到了子类 而子类可以重写接口方法以便创建的时候指定自己的对象类型 个人理
  • C++面试题之继承

    目录 设计一个类型 不能在外部环境中创建该类的对象 设计一个不能被继承的类 设计一个不能被继承的类 但可以在外部环境创建该类型的对象 设计一个能被继承的类 但不能在外部环境创建该类型的对象 限制派生类对象不可以拷贝和赋值如何实现 设计一个类
  • 《疯狂Java讲义》读书笔记(一)

    面向对象具有三个基本特征 封装 Encapsulation 继承 Inheritance 和多态 Polymorphism 继承是面向对象实现软件复用的重要手段 当子类继承父类 子类作为一个特殊的父类 将获得父类所有的属性和方法 封装是指将
  • java中的自定义对象排序

    对于数组排序我们知道有Arrays sort 方法 但是如果遇到想要对一个对象数组中的某个属性进行排序 我们该如何去做呢 以给学生成绩排序为例 首先创建一个存储学生对象的数组 package JAVA API public class So

随机推荐

  • curl学习2

    代理 什么是代理 Merrian Webster的解释是 一个通过验证的用户扮演另一个用户 今天 代理已经被广泛的使用 许多公司提供网络代理服务器 允许员工的网络客户端访问 下载文件 代理服务器处理这些用户的请求 libcurl支持SOCK
  • 滑动穿透终极解决方案

    问题描述 滑动穿透 浮层上的触控会导致底层元素滑动 问题探究 1 给body加overflow hidden pc端可以锁scroll 移动端无效 pc端可以直接overflow hidden解决 2 给body加overflow hidd
  • 数据结构学习系列之单向链表的去重

    单向链表的去重 所谓的去重 就是去除单向链表中重复的数据结点 代码如下 示例代码 int del rep link list node t phead if NULL phead printf 入参为NULL 请检查 n return 1
  • 云计算通俗解释,什么叫云计算

    计算已经越来越为大众所熟知 那么云计算到底是什么呢 有没有云计算通俗解释呢 云计算是由分布式计算 并行处理 网格计算发展来的 是一种新兴的商业计算模型 目前 对于云计算的认识在不断的发展变化 云计算仍没有普遍一致的定义 云计算 Cloud
  • 【Java】HashMap原理-JDK1.7与JDK1.8的区别

    一 HashMap 扩容 JDK1 7 和JDK1 8 扩容原理相同 HashMap初始化大小为16 负载因子为0 75 每次当容量大于16 0 75 时 进行扩容 扩容为原来的两倍 也可以通过构造方法修改 但HashMap会自动将给定初始
  • 小鹅通面试回顾

    如果大家也在找面试笔试题目内容 可以看我的总结文章 正在更新之中 有没涉及到的内容 欢迎大家指出 附链接 数据库 C C HTML OS 计网面试准备 更新中 一面内容 最开始时讲述一下自己学校时曾做过的一些项目内容 之后我自己介绍时说对于
  • qt 登陆界面账号和密码的验证

    这几天一直研究怎么让界面账号和密码验证的问题 特别想用数据库 一直有QSQLlitdatabase cant find 的问题 找了很多方法没成功 要交课设 所以放弃用其他方法 用文件存吧 比较省事 但是有个更简单的办法 哈哈 先看 转到槽
  • 云象区块链解读区块链如何赋能贸易金融

    陀螺公开课 是定位于区块链行业的线上精品教育课程 以视频的形式传递行业思考 内容板块包括技术前沿 产业案例 领袖视野 学术思想 名人演讲等 通过邀请行业领域专家线上讲课 及开放高质量视频投稿 为用户提供优质的区块链学习内容 陀螺公开课第三期
  • nrm 安装后报错 --- 亲测有效

    发现问题 执行指令 npm i g nrm 安装后 nrm V 报错 报错内容如下 import process from node process SyntaxError Cannot use import statement outsi
  • 自学Unity游戏开发日记

    Unity游戏开发的启蒙老师是麦扣老师 在bilibili 讲的非常的棒 后悔没有早点发现麦扣老师 第一个案例游戏 Sunny Land 印象最深的问题 在按下空格进行跳跃时 跳不起来 或者说偶尔能跳起来 这是因为GetButtonDown
  • 虚拟机安装windows11

    前言 在日常工作中有的时候需要在虚拟环境里使用windows系统 因为在虚拟环境里不存在病毒传播或者搞坏C盘后数据丢失情况 所以在虚拟机里安装windows 是一个必备技能 根据生活 乱编的 下载 windows11地址 首先安装一个迅雷
  • 如何使用计算机做海报,用word做的海报步骤_word怎么设计海报

    5 用word做招聘海报 首先先打开wps软件或者是新建一个word文档 如果你想打印一张出租 出售之类的广告的话最好是打印横版的 因为这类的广告文字比较少 横向排版有帮于把文字的大小放到最大 点击页面布局 选择其中的纸张方向 在弹出的纸张
  • 数据库表结构设计方法

    author skate time 2011 02 12 数据库表结构设计方法 当我们设计一个数据库存储模式时 要仔细分析数据模式 不要一股脑的把所有的数据都放在一起 那样的话对系统的可用性 高效能 扩展性都会有严重的影响 当然你设计的系统
  • Python 深度学习实战:75个有关神经网络建模、强化学习与迁移学习的解决方案

    深度学习正在为广泛的行业带来革命性的变化 对于许多应用来说 深度学习通过做出更快和更准确的预测 证明其已经超越人类的预测 本书提供了自上而下和自下而上的方法来展示深度学习对不同领域现实问题的解决方案 这些应用程序包括计算机视觉 自然语言处理
  • 中医蜂疗新起点,新思路,新未来

    2021年10月22日 24日由世界中医药学会联合会蜂疗专业委员会 中国民族医药学会主办的蜂界年度盛会 第三届世界蜂疗大会暨世界中联蜂疗专业委员会换届大会暨第四届学术年会 中国民族医药学会蜂疗分会换届会议暨2021年学术年会在庄严的首都北京
  • Golang交叉编译中的那些坑

    最近两个月 一直在搞项目的国产化移植 把golang开发好的程序 运行在国产化平台上 操作系统基本都是基于Linux 但是CPU架构除了x86 还有ARM和MIPS 我们平时的Golang都是运行于x86 x64 架构的CPU上 因此移植过
  • android 自定义滑动按钮控件

    在很多时候我们看到在iphone手机应用中都有滑动开启和关闭这个功能 在android40以下的版本中且没有这个功能 但是android手机在使用的多是4 0以下的系统 所以为了满足需求 我们自己设计自定的滑动开启和关闭按钮 第一步 创建一
  • JS正则表达式用星号*替换字符串开头或结尾几个字符

    let str 1234567890 console log 原字符串 str console log 替换前3位 str replace 3 console log 替换后4位 str replace 4 console log 替换前3
  • 【EMC基础篇①】噪声是什么?EMC是什么?噪声损害是电子社会的现代病

    EMC基础篇 噪声是什么 EMC是什么 噪声损害是电子社会的现代病 电脑的通信错误 手机通话突然断开 您有过类似的经验吗 我们周围充斥着噪声 它们会通过各种线路侵入电子设备 引发故障 那么 这些看不见的噪声的真身是什么 本周为您带来3篇关于
  • js设计模式基础篇(四)之高阶函数

    高阶函数 高阶函数是指至少满足下列条件之一的函数 函数可以作为参数被传递 函数可以作为返回值输出 函数作为参数传递 把函数当作参数传递 这代表我们可以抽离出一部分容易变化的业务逻辑 把这部分业务逻辑放在函数参数中 这样一来可以分离业务代码中