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

 更新时间:2013年01月10日 08:55:20   作者:  
这几个方法均为javascript 1.6 数组新增的方法。是很典型的functional 函数,当然也非常实用。下面是functional的定义并不来自javascript

缘由
虽然以前也使用过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 DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)

    Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)

    这篇文章主要介绍了Javascript DOM事件操作,结合实例形式总结分析了javascript监听鼠标点击、释放,悬停、离开等操作技巧,需要的朋友可以参考下
    2017-01-01
  • JavaScript中的各种宽高属性的实现

    JavaScript中的各种宽高属性的实现

    这篇文章主要介绍了JavaScript中的各种宽高属性的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • 详解ES6语法之可迭代协议和迭代器协议

    详解ES6语法之可迭代协议和迭代器协议

    这篇文章主要介绍了详解ES6语法之可迭代协议和迭代器协议,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • JS延时提示框实现方法详解

    JS延时提示框实现方法详解

    这篇文章主要介绍了JS延时提示框实现方法,以实例形式较为详细的分析了JavaScript实现延时提示功能的原理与具体实现步骤,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 微信小程序绘制半圆(弧形)进度条

    微信小程序绘制半圆(弧形)进度条

    这篇文章主要为大家详细介绍了微信小程序绘制半圆(弧形)进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • js实现简易ATM功能

    js实现简易ATM功能

    这篇文章主要为大家详细介绍了js实现简易ATM功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • 微信小程序getLocation 需要在app.json中声明permission字段

    微信小程序getLocation 需要在app.json中声明permission字段

    这篇文章主要介绍了微信小程序getLocation 需要在app.json中声明permission字段,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • javascript实现分栏显示小技巧附图

    javascript实现分栏显示小技巧附图

    考试页面可以实现隐藏左边的考生信息部分,学了javascript后也能实现这个功能了,下面是实现思路、代码及解效果截图,喜欢的朋友们可以看看
    2014-10-10
  • setTimeout()递归调用不加引号出错的解决方法

    setTimeout()递归调用不加引号出错的解决方法

    用了setTimeout()想实现递归调用,如果第一个参数不加引号的话,就会出错,下面与大家分享下该如何解决
    2014-09-09
  • JavaScript实现鼠标点击后层展开效果的方法

    JavaScript实现鼠标点击后层展开效果的方法

    这篇文章主要介绍了JavaScript实现鼠标点击后层展开效果的方法,可实现点击文字缓慢展开层的效果,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05

最新评论