js高阶函数部分应用

来源:互联网 发布:慢慢买怎么看淘宝价格 编辑:程序博客网 时间:2024/06/05 06:22

据《JavaScript设计模式与开发实践一书》的定义,高阶函数是指至少满足以下条件之一的函数:

1.函数可以作为函数被传递

2.函数可以作为返回值被输出


下面详细分析一下几种应用场景:

1.函数作为参数传递,这种情况在需要callback的地方非常多,另外尤其是在ajax异步请求和绑定事件中,举一个简单的array方法sort的例子

array的sort方法拥有自己的默认方法,但是如果你以为他是万能的那就错了,他实现的是按照字符编码来进行排序,在最常见的数字排序使用中我们一般都是使用自己定义的方法作为参数覆盖默认方法:

[1,3,2,4].sort( function( a, b ){   return a-b;});//输出[1,2,3,4]

以上代码实现的就是基于sort函数的最简单的数字升序自定义方法,其将一整个自定义方法作为了参数传递给了sort方法。


2.函数作为返回值输出,实现闭包时经常有函数返回值作为闭包私有变量访问的接口,举一个单例模式的例子:

所谓单例模式字面理解就是只能有一个例子,也就是只能有一个实例,实现也很简单,每次要创建实例时都判断一下是不是已经创建了一个实例即可

var getSingle = function(fn){var ret;return function(){return ret || ( ret = fn().apply( this, arguments ));};};var getDiv = getSingle( function(){return document.createElement( "div" );});var div1 = getDiv();var div2 = getDiv();alert(div1 === div2);
以上代码实现的就是一个简单的单例模式,其功能就是创建一个唯一的div元素,主逻辑函数传递了一个函数参数进去,输出了一个函数返回值出来,利用闭包创建了一个只能由getDiv函数才能访问的ret私有变量来储存创建过的实例,每次创建的返回值都是ret或者函数调用创建的新div,以此实现只有一个实例的单例模式。


3.函数柯里化

currying又称部分求值,通俗点说就是每次只求一部分值,等到最后函数完全启动完毕之后取得最终结果,直接上例子:

var sum = function( fn ){var total = [];return function(){if( arguments.length === 0 ){return fn.apply( this, total);}else{[].push.apply( total, arguments);}};};var sumNumber = sum(function(){var n = 0;for(var  i = 0; i<arguments.length; i++){n += arguments[i];}return n;});sumNumber(1);sumNumber(2);alert(sumNumber());//3

首先闭包定义了一个柯里化的函数,功能为若sumNumber含有参数则将参数放入total私有变量中,若没有参数则将total数组中的元素叠加起来,sum是这一段程序的主体部分,包括一个私有变量和一个函数返回值,函数返回值if成功的情况是sumNumber中没有传入参数,则对total进行fn函数,如果sumNumber中传入了参数,则将其保存在total数组中;接下来定义了sum函数的fn参数,即一个叠加函数;


4.范化this uncurrying

call和apply实现了让对象去调用一个他不能调用的函数,其最主要的功能就是明确了this的指向,uncurrying旨在将call和apply范化this的过程提取出来,下面举一个例子:

Function.prototype.uncurrying = function (){var self = this;return function (){return Function.prototype.call.apply( self, arguments );};};

var push = Array.prototype.push.uncurrying;console.log( push( [1,2,3,4], 5) );//[ 1,2,3,4,5 ]

讲解一下代码,首先先保存this,即原函数引用,然后设置一个函数作为返回值,这个返回值中对call函数进行了apply方法调用,所以其实就是对原函数调用call方法。


另外还有函数节流(控制易频繁触发的函数的发生频率,可应用定时器等),分时函数(将大规模任务分成多个小任务完成),惰性加载函数(通过嗅探判断等方式在函数内部重新定义正确函数形式,以便以后应用)等应用,本篇将不再赘述。





0 0