Javascript中的高阶函数介绍


Posted in Javascript onMarch 15, 2015

这是一个有趣的东西,这或许也在说明Javascript对象的强大。我们要做的就是在上一篇说到的那样,输出一个Hello,World,而输入的东西是print('Hello')('World'),而这就是所谓的高阶函数。

高阶函数

高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的。

Javascript的高阶函数

然而,高阶函数只是将函数作为参数或返回值的函数。以上面的Hello,World作为一个简单的例子。

var Moqi = function(p1){

    this.add = function (p2){

        return p1 + ' ' + p2;

    };

    return add;

};

我们便可以这样使用这个函数

console.log(Moqi('Hello')('World'));

或许这个过程有点混乱,看看详细一点的。
> typeof Moqi('Hello')

<- "function"

> Moqi('Hello')

<- function (p2){

        return p1 + ' ' + p2;

    }

也就是说实际上Moqi('Hello')是一个函数,Moqi('Hello')
> var m = Moqi('Hello')        

 > m('World')

 > "Hello,World"

 

从上面的情况来看,高阶函数可以使代码更简洁、高效。自然而然地我们也可以创建一个函数,以便于:
 > Moqi('Hello')('World')('Phodal')

 > "Hello,World Phodal"

于是就有了这样一个函数
var Moqi = function(p1){

    return  function (p2){

        return function(p3){

            return p1 + ',' + p2 + ' ' +p3;

        }

    };

};

还原高阶函数

越来越复杂,需要引入高阶函数抽象的信号是出现重复或者相似的代码。然后,我们先一步步还原到之前的函数:

var Moqi = function(p1){

     this.add =  function (p2){

        return function(p3){

            return p1 + ',' + p2 + ' ' +p3;

        }

    };

    return this.add;

};

接着再创建一个新的函数
var Moqi = function(p1){

     this.add =  function (p2){

        this.add1 = function(p3){

            return p1 + ',' + p2 + ' ' +p3;

        };

        return this.add1;

    };

    return this.add;

};

使用javascript中的call方法,就会有:
var Moqi = function(p1){

    var self = this;
    function fd(p2) {

        this.add1 = function (p3) {

            return p1 + ',' + p2 + ' ' + p3;

        };

    }
    self.add =  function (p2){

        fd.call(this, p2);

        return this.add1;

    };

    return self.add;

};

高阶函数实例

上面的例子只是为了好玩,下面的例子是真正的运用。

add = function(a,b){

    return a + b;

};
function math(func,array){

    return func(array[0],array[1]);

}
console.log(math(add,[1,2]));
> math(add,[1,2])

< 3

在上面的例子中传进去的add是一个参数,而在return的时候刚是一个函数。如在jQuery中有一个函数用于
// Convert dashed to camelCase; used by the css and data modules

// Microsoft forgot to hump their vendor prefix (#9572)

camelCase: function( string ) {

    return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );

},

也是这样的运用,可见高阶函数对于掌握好JS的重要。。
Javascript 相关文章推荐
利用javascript/jquery对上传文件格式过滤的方法
Jul 25 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
Nov 14 Javascript
jQuery基于当前元素进行下一步的遍历
May 20 Javascript
javascript实现简单的页面右下角提示信息框
Jul 31 Javascript
js实现图片上传并正常显示
Dec 19 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
功能强大的Bootstrap组件(结合js)
Aug 03 Javascript
js中判断变量类型函数typeof的用法总结
Aug 09 Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
Oct 16 Javascript
使用veloticy-ui生成文字动画效果
Feb 08 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
Oct 09 Javascript
JS实现从对象获取对象中单个键值的方法示例
Jun 05 Javascript
Javascript中this关键字的一些小知识
Mar 15 #Javascript
Javascript URI 解析介绍
Mar 15 #Javascript
PHP+jQuery+Ajax实现多图片上传效果
Mar 14 #Javascript
jQuery oLoader实现的加载图片和页面效果
Mar 14 #Javascript
jQuery实现购物车数字加减效果
Mar 14 #Javascript
jQuery+PHP实现动态数字展示特效
Mar 14 #Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
Mar 14 #Javascript
You might like
玩转图像函数库―常见图形操作
2006/09/03 PHP
改进的IP计数器
2006/10/09 PHP
PHP的中问验证码
2006/11/25 PHP
用PHP查询搜索引擎排名位置的代码
2010/01/05 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
JS实现超简单的鼠标拖动效果
2015/11/02 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
iview实现图片上传功能
2020/06/29 Javascript
JavaScript 中的六种循环方法
2021/01/06 Javascript
Python调用系统底层API播放wav文件的方法
2017/08/11 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
2018/02/13 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
python实现多线程端口扫描
2019/08/31 Python
Python实现爬取网页中动态加载的数据
2020/08/17 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
核心价值观演讲稿
2014/05/13 职场文书
小学开学标语
2014/07/01 职场文书
补充协议书
2015/01/28 职场文书
教师节老师寄语
2015/05/28 职场文书
python全面解析接口返回数据
2022/02/12 Python
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB