高阶函数

什么是高阶函数

  • 高阶函数 (Higher-order function)

    • 可以把函数作为参数传递给另一个函数
    • 可以把函数作为另一个函数的返回结果
  • 函数作为参数

模拟 forEach

// forEach
function forEach (array, fn) { for (let i = 0; i < array.length; i++) { fn(array[i]) }
}let arr = [1, 3, 4, 7, 8]
forEach(arr, function (item) {console.log(item)
})

模拟 filter

// filter
function filter (array, fn) {let results = [] for (let i = 0; i < array.length; i++) {if (fn(array[i])) { results.push(array[i]) } }return results
}let arr = [1, 3, 4, 7, 8]// 过滤取偶数
let returnArr = filter(arr, function (item) {return item % 2 === 0
})
console.log(returnArr)
  • 函数作为返回值
function makeFn () { let msg = 'Hello function' return function () { console.log(msg) }
}makeFn()()   // 调用 makeFn 函数返回的函数// 或
const fn = makeFn()
fn()

模拟 once 函数

// once
function once (fn) { let done = false return function () { if (!done) { done = true // 使用 apply 来调用 fn 函数, 把其中的 this 传递过来,方便改变 this// 通过 arguments 传递 return 的 function 的参数给 fn 函数 return fn.apply(this, arguments) } }
}// 声明 pay 函数 调用 once
let pay = once(function (money) { console.log(`支付:${money} RMB`)
})// 调用 pay 函数
// 只会支付一次
pay(5)
pay(5)
pay(5)

使用高阶函数的意义

  • 抽象可以帮我们屏蔽细节,只需要关注与我们的目标
  • 高阶函数是用来抽象通用的问题
  • 使代码写起来更加简洁

常用高阶函数

  • forEach
  • map
  • filter
  • every
  • some
  • find/findIndex
  • reduce
  • sort
    ……

模拟 map() 函数

const map = (array, fn) => {let results = []for (let value of array) {results.push(fn(value))}return results
}let arr = [1, 2, 3, 4]
arr = map(arr, (item) => item * item)
console.log(arr)

模拟 every() 函数

const every = (array, fn) => {let result = truefor (let value of array) {result = fu(value)if (!result) {break}}return result
}let arr = [9, 12, 13]
let r = every(arr, (item) => item > 10)
console.log(r)

( js中break,return,continue区别 )

模拟 some() 函数

const some = (array, fn) {let result = falsefor (let value of array) {result = fn(value)if (result) {break}}return result
}let arr = [1, 3, 4, 5]
let r = some(arr, (item) => item % 2 === 0)
console.log(r)

闭包

  • 闭包 (Closure):函数和其周围的状态(词法环境)的引用捆绑在一起形成闭包。

    • 可以在另一个作用域(例如函数C)中调用一个函数(函数A)的内部函数(函数B)并访问到该函数(函数A)的作用域中的成员
  • 闭包的本质:函数在执行的时候会放到一个执行栈上当函数执行完毕之后会从执行栈上移除,但是
    堆上的作用域成员因为被外部引用不能释放
    ,因此内部函数依然可以访问外部函数的成员
// 闭包
function fnB () { let msg = 'Hello function' return function () {  // fnCconsole.log(msg) }
}const fnA = fnB()
fnA()
  • 闭包案例
// 生成计算数字的多少次幂的函数
function makePower (power) {return function (number) {return Math.pow(number, power)}
}// 2次方
let power2 = makePower(2)
// 3次方
let power3 = makePower(3)console.log(power2(2))
console.log(power2(5))
console.log(power3(5))


运行以上代码,在开发者工具中打断点调试,查看函数运行过程。

Call Stack 为当前站点调用函数,可以在途中看到调用两个匿名函数

Scope 为作用域,Local 为局部作用域(里面的变量是 number,this 指向是 Window)

Closure 为闭包(里面是跟闭包相关的变量 power ),跟闭包相关的外部函数是 makePower

通过 let 定义的变量,他的作用域可以在 Script 找到,通过 var 定义的变量会挂载在 Global 全局对象上

学习笔记——高阶函数相关推荐

  1. 深圳大数据学习:高阶函数--【千锋】

    深圳大数据学习:高阶函数–[千锋] 1.1. 概念 如果一个函数的传入参数为函数或者返回值是函数,则该函数即为高阶函数. 1.2. 传入参数为函数 Scala中,函数是头等公民,和数字一样.不仅可以调 ...

  2. [读书笔记]高阶函数

    1. 什么是高阶函数 函数可以作为参数被传递: 函数可以作为返回值输出. 2. 高阶函数的示例 2.1 函数作为参数传递 (1) 回调函数(callback) 回调函数类似于C#中的委托,在异步操作中 ...

  3. python学习之高阶函数

    一.函数式编程 在Python中,函数是一等对象 - 一等对象一般都会具有如下特点: ① 对象是在运行时创建的 ② 能赋值给变量或作为数据结构中的元素 ③ 能作为参数传递 ④ 能作为返回值返回 就是将 ...

  4. 在廖雪峰官网学习 python 高阶函数

    filter() 函数检测回数(回数是从左往右和从右往左读一样的数,如21012): def is_palindrome(n):nums = str(n)nums_r = "".j ...

  5. scala入门之高阶函数案例

    基于Java学习scala 高阶函数练习案例 1.定义一个高阶函数,按照指定的规则对集合里面的每个元素进行操作 2.定义一个高阶函数,按照指定的规则对集合中的所有元素进行聚合 3.定义一个高阶函数,按 ...

  6. python order函数_Python进阶内容(一)--- 高阶函数 High order function

    0. 问题 # 本文将围绕这段代码进行Python中高阶函数相关内容的讲解 # 文中所有代码的兼容性要求为:Python 3.6,IPython 6.1.0 def addspam(fn): def ...

  7. Python学习笔记__4.1章 高阶函数

    # 这是学习廖雪峰老师python教程的学习笔记 1.概览 我们知道Python内置的求绝对值的函数是abs() # 调用abs()函数可以获得一个值 >>> abs(-10) 10 ...

  8. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  9. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

最新文章

  1. FPGA之道(50)复位的设计
  2. java两个函数名字相同_为什么C不允许两个具有相同名称的函数/类模板,只有非类型模板参数(整数类型)的类型不同?...
  3. ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)
  4. JSR303—Bean Validation验证
  5. python类型转换异常捕捉_Java中的异常
  6. jackson 的注解:@JsonProperty、@JsonIgnore、@JsonFormat 用法说明
  7. 超有用的方法-----英语单词记忆篇
  8. 长方体工艺品の切割(洛谷P5729题题解,Java语言描述)
  9. JavaScript和Java的区别
  10. 爆款预定!雷军再曝小米12 Pro:首发自研芯片澎湃P1
  11. [费用流]洛谷 P2053 修车(zkw费用流模版)
  12. 彻底理解Java的Future模式
  13. 俄罗斯方块英文JAVA版下载_俄罗斯方块java源代码完美版
  14. axios的安装和使用
  15. word vba 控制光标常用代码
  16. windows11百度网盘下载,win11iso镜像百度云下载
  17. Apache探索:Windows下搭建PHP运行环境(详细图文教程)
  18. RStudio的安装
  19. PLG软件的运行环境设置
  20. 清华大学计算机学院院庆,清华计算机系2014年校庆系列活动

热门文章

  1. ERROR 1184 (HY000): Invalid DataSource:0
  2. Android实现收款成功金额的语音播报功能(Nice tone)
  3. Memcached对象缓存详解
  4. 使用Python在Excel中批量生成条形码
  5. mac:设置多久后息屏
  6. memcache高集群搭建----主从同步实验
  7. Python 关键字global全局变量详解
  8. Camera APP 问题集锦
  9. Pygame入门 2022 (4) 使用精灵类重构
  10. java 本月剩余天数_java基础 计算今天距本月最后一天还剩多少天