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 相关文章推荐
仿jQuery的siblings效果的js代码
Aug 09 Javascript
jQuery自带的一些常用方法总结
Sep 03 Javascript
JavaScript中的6种运算符总结
Oct 16 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
Dec 19 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 Javascript
JS实现的加减乘除四则运算计算器示例
Aug 09 Javascript
laydate如何根据开始时间或者结束时间限制范围
Nov 15 Javascript
js字符串倒序的实例代码
Nov 30 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
Jan 27 Javascript
JS使用正则表达式判断输入框失去焦点事件
Oct 16 Javascript
Vue实现背景更换颜色操作
Jul 17 Javascript
详解Vue中的watch和computed
Nov 09 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/11/16 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
php 随机排序广告的实现代码
2011/05/09 PHP
php 访问oracle 存储过程实例详解
2017/01/08 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
DOM 事件流详解
2015/01/20 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
JS实现DIV容器赋值的方法
2015/12/14 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
js作用域和作用域链及预解析
2019/04/11 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
解决vue项目本地启动时无法携带cookie的问题
2021/02/06 Vue.js
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
python 实现矩阵填充0的例子
2019/11/29 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
CSS3制作圆角图片和椭圆形图片
2016/07/08 HTML / CSS
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
Noon埃及:埃及在线购物
2019/11/26 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
STP的判定过程
2012/10/01 面试题
个人简历的自荐信
2013/10/23 职场文书
报到证丢失证明
2014/01/11 职场文书
《花木兰》教学反思
2014/04/09 职场文书
高中教师评语大全
2014/04/25 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
新郎结婚感言
2015/07/31 职场文书