JavaScript进阶设计模式系列——基础篇——高阶函数

来源:互联网 发布:复印件制作软件 编辑:程序博客网 时间:2024/05/22 07:04

定义:

是指满足下列条件之一的函数:

  1. 函数可作为参数被传递
  2. 函数可作为返回值输出

详情参见维基百科定义:

应用场景

作为参数传递

回调函数

其实,从本质上来讲:回调函数和委托是一回事儿。当一个函数不适合执行一些请求的时候,我们把这些请求封装成一个函数,并把它作为参数传递给另外一个函数,委托其他的函数来执行。

在Ajax的使用过程中,回调函数使用非常频繁。我们想要在Ajax请求完成后,执行一些操作,但是有不知道返回的确切时间,最常见的方案就是把callback函数当做参数传入发起Ajax请求的方法中,在请求完成之后,执行callback函数。

作为返回值输出

让函数继续返回一个可执行的函数,这样运算过程就被延续了。

实例演示:

var getSingle = function (fn) {    var ret ;//由于使用了闭包,第二次访问的时候,ret保留了上一次的值    return function () {        return ret || (ret = fn.apply(this,arguments));    };};var getScript = getSingle(function () {    return {        name : 'script'    }});var script1 = getScript();var script2 = getScript();console.log(script1 === script2); //输出true

实现AOP

/** * Created by bill on 7/4/2017. */Function.prototype.before = function (beforefn) {    var _self = this; //保留对原函数的引用    return function () {        beforefn.apply(this,arguments);//改变this 的指向,调用before函数        _self.apply(this,arguments); //调用原函数    }}Function.prototype.after = function (afterfn) {    var _self = this;    return function () {        var ret = _self.apply(this,arguments);        afterfn.apply(this,arguments);        return ret;    }}var func = function () {    console.log('2')}func = func.before(function () {    console.log('1')}).after(function(){    console.log('3')});func();
上面的这段程序结果输出为:1 2 3 

其他高阶函数的应用场景

函数currying(柯里化)

定义:维基百科

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术

它还可以称之为部分求值。

函数UNcurrying(反柯里化)

函数节流

分时函数

惰性加载函数

后话:其他应用,大家有兴趣的自行研究下吧,就不一一和大家介绍了。

阅读全文
0 0