javascript之典型高阶函数应用介绍


Posted in Javascript onJanuary 10, 2013

缘由
虽然以前也使用过javascript语言,但终究是为了配合后端写的一些零零散散的“代码段”,更不能说是javascript项目了。很荣幸的是上个月刚到公司正好碰上项目开始推倒重写,我们team从头开始做架构和实现,目的很清楚,为了改进和超越前面的版本。这是个真正意义上的javascript“项目”,当然服务端不是我们team来负责啦。这也是我真正开始全职使用javascript来编程。由于之前在学校对形式化方法这门课程比较感兴趣,而javascript又是函数式语言,因此我想把更多functional的东西用javascript来表现一下。

几个函数
这几个方法均为javascript 1.6 数组新增的方法。是很典型的functional 函数,当然也非常实用。下面是functional的定义并不来自javascript。

filter:接受一个集合Xs(X表示类型,s表示集合),一个谓词,这个谓词是从X到bool的映射(函数)。然后过虑这个集合,并返回谓词为true的元素组成的集合。下面是简单的实现:

function filter(arr,callback){ 
var i,out=[]; 
for(i=0;i<arr.length;i++){ 
if(callback(arr[i])) 
out.push(arr[i]); 
} 
return out; 
}

再加一个简单的测试:
var arr = [1,2,3,4,5,6,7,8,9,10]; 
var even = function(item){ 
if(typeof item !== "number") return false; 
return !(item & 1); 
}; 
var filtered = filter(arr,even); 
console.log(filtered);

结果:
2,4,6,8,10
map:接受一个集合Xs,一个函数f,然后把Xs集合中每一个元素按照顺序使用f映射,并返回集合f x1, f x2, f x3 ... f xn。实现如下:
function map(arr,callback){ 
var i,l= arr && arr.length || 0,out = new Array(l); 
for(i=0;i<l;i++) 
out[i]=callback(arr[i]); 
return out; 
}

测试一下:
var arr = [1,2,3,4,5,6,7,8,9,10]; 
var addTen = function(item){ 
return item + 10; 
}; 
var mapAdded = map(arr,addTen); 
console.log(mapAdded);

结果:
11,12,13,14,15,16,17,18,19,20
另外还有forEach,every和some三个函数在javascript 1.6中出现。但在使用过程中感觉还是缺少一个有力的函数,它就是折叠函数(fold)。正所谓map-reduce,有了map而没有"reduce"岂不是很扫兴?下面就来看看这个”reduce“。

Reduce的实现
上面说的reduce其实也就是折叠函数(fold)。它接受一个Xs集合,一个二元操作符f。然后将f插入到集合中的每两个相邻元素之间。举个例子,fold plus [1,2,3,4] 意即 1+2+3+4。为了更加精确,通常需要一个”起始元素“作为f最开始时的第二个参数。例如 fold plus [1,2,3,4] 意即 (1+(2+(3+(4+0)))。下面是实现:

function fold(arr,callback,b){ 
var i,x; 
if(b) x=b,i=0; 
else x=arr[0],i=1; 
for(;i<arr.length;i++) 
x=callback(arr[i],x); 
return x; 
}

测试:
var arr = [1,2,3,4,5,6,7,8,9,10]; 
var plus = function(a,b){ 
return a+b; 
}; 
var foldPlus = fold(arr,plus,0); 
console.log(foldPlus);

结果:
55

这个函数在ECMAScript 5中名字就叫reduce,而函数式里面通常称做fold而已,这是很形象的名字。
总结
其实上面在实现这些functional函数的时候编写风格并不是函数式的,因为javascript 语言有具有循环语句。如果没有循环语句呢?留给下一次探索吧。

Javascript 相关文章推荐
JQuery与JSon实现的无刷新分页代码
Sep 13 Javascript
php实例分享之实现显示网站运行时间
May 20 Javascript
javascript入门教程基础篇
Nov 16 Javascript
JS动态改变浏览器标题的方法
Apr 06 Javascript
下一代Bootstrap的5个特点 超酷炫!
Jun 17 Javascript
jQuery插件uploadify实现ajax效果的图片上传
Jun 18 Javascript
AngularJS基础 ng-cloak 指令简单示例
Aug 01 Javascript
Javascript获取图片原始宽度和高度的方法详解
Sep 20 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
Oct 13 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
Mar 16 Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
Aug 06 Javascript
根据json字符串生成Html的一种方式
Jan 09 #Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
Jan 09 #Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 #Javascript
实现web打印的各种方法介绍及实现代码
Jan 09 #Javascript
js去除重复字符串两种实现方法
Jan 09 #Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
Jan 09 #Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
Jan 09 #Javascript
You might like
全国FM电台频率大全 - 29 青海省
2020/03/11 无线电
php 在线打包_支持子目录
2008/06/28 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
js版本A*寻路算法
2006/12/22 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
js、css、img等浏览器缓存问题的2种解决方案
2013/10/23 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
JS实现异步上传压缩图片
2017/04/22 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
python解析xml文件实例分享
2013/12/04 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
Python实现常见的回文字符串算法
2018/11/14 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
pytorch实现对输入超过三通道的数据进行训练
2020/01/15 Python
Python LMDB库的使用示例
2021/02/14 Python
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
建筑学推荐信
2013/11/03 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
涨价通知
2015/04/23 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
交通安全宣传标语(100条)
2019/08/22 职场文书
教你如何用python开发一款数字推盘小游戏
2021/04/14 Python
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电
PyTorch中的torch.cat简单介绍
2022/03/17 Python