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 Ajax.ashx 高效分页实现代码
Oct 20 Javascript
给jQuery方法添加回调函数一款插件的应用
Jan 21 Javascript
2014年50个程序员最适用的免费JQuery插件
Dec 15 Javascript
七个不允许错过的jQuery小技巧
Dec 21 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
Apr 14 Javascript
详解ECMAScript6入门--Class对象
Apr 27 Javascript
JavaScript实现自动跳转文本功能
May 25 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
Sep 22 jQuery
vue微信分享 vue实现当前页面分享其他页面
Dec 02 Javascript
详解为生产环境编译Angular2应用的方法
Dec 10 Javascript
js取小数点后两位四种方法
Jan 18 Javascript
vue-iview动态新增和删除的方法
Jun 17 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
PHP $_SERVER详解
2009/01/16 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
php 猴子摘桃的算法
2017/06/20 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
JS监听事件的叠加和移除功能
2018/11/19 Javascript
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
基于JavaScript实现猜数字游戏代码实例
2020/07/30 Javascript
Python验证码识别的方法
2015/07/10 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python Numpy数组扩展repeat和tile使用实例解析
2019/12/09 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
Tiqets英国:智能手机上的文化和娱乐门票
2019/07/10 全球购物
大专生毕业的自我评价
2014/02/06 职场文书
暑期教师培训方案
2014/06/07 职场文书
罚款通知怎么写
2015/04/22 职场文书
千与千寻观后感
2015/06/04 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
《兰兰过桥》教学反思
2016/02/20 职场文书
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android