JavaScript中的高阶函数
之前写的《JavaScript学习手册》,客户跟我说有些内容不适合初学者,让我删了,感觉挺可惜的,拿到这里和大家分享。
JavaScript中的一切都是对象,这句话同样适用于函数。函数对象可以作为函数的参数。
一 函数对象作为另一个函数的参数
函数可以作为另外一个函数的参数,这里的“另外一个函数”可以返回具体的值,也可以返回一个函数。第二种情况就是函数的函数,称为高阶函数。在介绍这两种情况之前,先了解一下 call() 和 apply() 方法:
call() 的使用方式为 被调用的函数.call(调用者,参数1,参数2....),功能为:调用者调用被调用的函数,并传入参数列表。
apply() 的使用方式为 被调用的函数.apply(调用者,参数组成的数组),功能为:调用者调用被调用的函数,并传入参数数组。
call() 和 apply() 里面如果传入的第一个参数是 this ,表示的是函数的调用者。
var store = {name:"myStore", id:5622};
function getSalesVolume(a, b) {
return a + b;
}
//store后面有两个参数
getSalesVolume.call(store, 40000, 50000);//返回90000
//store后面是一个参数数组,长度为2
getSalesVolume.apply(store, [40000, 50000]);//返回90000
二 返回值
一个函数作为另外一个函数的参数,并最终返回一个值。
//求最大值
function getMax(a, b) {
return a > b ? a : b;
}
//求最小值
function getMin(a, b) {
return a < b ? a : b;
}
//下面这个函数以函数作为参数,并最终返回一个值
function getM(func, num1, num2) {
return func(num1, num2);
}
getM(getMax, 1, 2);//返回2
getM(getMin, 1, 2);//返回1
getM() 的第一个参数是函数的名字,但是不能用双引号包含在内。
三 高阶函数
高阶函数的输入是函数,输出也是函数。即一个函数调用另外一个函数,然后返回一个新的函数。比如通过调用求两个数的最大值的函数,实现求n个数的最大值的函数,就可以用到高阶函数来实现:
//求最大值
function twoMax(a, b) {
return a > b ? a : b;
}
function getMax(func) {
return function() { //返回一个匿名函数
var aLength = arguments.length;
var result = 0;
for (var i = 0;i < aLength;i++) {
result = func.call(this, result, arguments[i]);
}
return result;
};
}
var multiMax = getMax(twoMax);
console.log(multiMax(1, 2, 3, 4));//输出4
上面的 getMax() 函数在传入实参 twoMax() 函数后,会返回一个新的函数 multiMax() ,用来求多个数的最大值。getMax() 每次求两个数的最大值,然后再将这个最大值与第三个数比较,求最大值,这样一直进行下去,就可以求得多个数的最大值。
JavaScript中的高阶函数的更多相关文章
- 如何在JavaScript中使用高阶函数
将另一个函数作为参数的函数,或者定义一个函数作为返回值的函数,被称为高阶函数. JavaScript可以接受高阶函数.这种处理高阶函数的能力以及其他特点,使JavaScript成为非常适合函数式编程的 ...
- javascript中的高阶函数, 和 类定义Function, 和apply的使用
参考: http://www.cnblogs.com/delin/archive/2010/06/17/1759695.html js中的类, 也是用function关键字来定义的: function ...
- Javascript中的高阶函数介绍
高阶函数:高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的. Javascript的高阶函数 然而,高阶函数只是将函数作为参数或返回值的函数.以下面的Hello,Wo ...
- Javascript 闭包与高阶函数 ( 二 )
在上一篇 Javascript 闭包与高阶函数 ( 一 )中介绍了两个闭包的作用. 两位大佬留言指点,下来我会再研究闭包的实现原理和Javascript 函数式编程 . 今天接到头条 HR 的邮件,真 ...
- JavaScript进阶之高阶函数篇
JavaScript进阶之高阶函数篇 简介:欢迎大家来到woo爷说前端:今天给你们带来的是JavaScript进阶的知识,接下来的系列都是围绕着JavaScript进阶进行阐述:首先我们第一篇讲的是高 ...
- JS中的高阶函数
JS中的高阶函数 高阶函数是指以函数作为参数的函数,并且可以将函数作为结果返回的函数. 1. 高阶函数 接受一个或多个函数作为输入 输出一个函数 至少满足以上一个条件的函数 在js的内置对象中同样存在 ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
- Python中的高阶函数与匿名函数
Python中的高阶函数与匿名函数 高阶函数 高阶函数就是把函数当做参数传递的一种函数.其与C#中的委托有点相似,个人认为. def add(x,y,f): return f( x)+ f( y) p ...
- Java中的函数式编程(五)Java集合框架中的高阶函数
写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程. 本文的 ...
随机推荐
- Vue(day2)
一.过滤器 Vue中可以自定义过滤文本插值的过滤器.目前有两个地方可以使用: 插值文本{{ var }}中使用. 在v-bind中使用.( 2.1.0+ ) 用法:使用管道连接符 | 将需要过滤的文本 ...
- 修复FFMPEG 复用 PAT、PMT发送间隔小于25ms的错误
目录 分析ffmpeg源码 分析问题 修改源码解决问题 分析ffmpeg源码 分析问题 mpegtsenc.c 找到发送PAT.PMT的函数 /* send SDT, PAT and PMT tabl ...
- 读取Json,并替换json中的指定字符
string jsonfile = @"E:\history.json";//JSON文件路径 using (System.IO.FileStream file = new Fil ...
- Java面向对象特征之封装
package practice;/** * @功能 创建动物类,对动物的属性进行封装 * @author square 凉 * */public class Animal { /** * 动物姓名 ...
- git push 时提示用户名或密码相关错误信息
这里讲的是一个常见的第一次push提示输入用户名密码时,输入错误的解决办法.它导致在后面其他项目什么的在push的时候一直失败,并提示有用户名密码错误信息. 第一步:进入到“控制面板” (这里如何进入 ...
- 解决SpringMVC中文乱码问题 -----这是服务器返回参数到前端中文乱码
方法一,使用(produces = "application/json; charset=utf-8"): @RequestMapping(value="/getUser ...
- CentOS6.5中部署java web环境
原来在linux中部署java web环境,没有做好总结,这次在部署的过程中,将部署的过程做了记录,希望对大家有帮助.主要内容包括CentOS安装以后的网络设置,系统自带jdk的卸载,新版本jdk的安 ...
- 【Impala篇】---Hue从初始到安装应用
一.前述 Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能.基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等优点 是CDH平台首选的PB ...
- 微信小程序实战–集阅读与电影于一体的小程序项目(八)
31.电影详情页面 movie-template.wxml <view class="movie-container" catchtap="onMovieTap&q ...
- Xcode 命令行工具 Command Line Tools
xcode命令行工具包是一个小型独立包,可供下载独立于Xcode的和允许您执行命令行开发OS X. 在OS X10.9,就以及没有clt的下载安装包了,需要使用命令在线安装. xcode-select ...