zoukankan      html  css  js  c++  java
  • JavaScript中的高阶函数

    之前写的《JavaScript学习手册》,客户跟我说有些内容不适合初学者,让我删了,感觉挺可惜的,拿到这里和大家分享。

    JavaScript中的一切都是对象,这句话同样适用于函数。函数对象可以作为函数的参数。

    一 函数对象作为另一个函数的参数

    函数可以作为另外一个函数的参数,这里的“另外一个函数”可以返回具体的值,也可以返回一个函数。第二种情况就是函数的函数,称为高阶函数。在介绍这两种情况之前,先了解一下 call() 和 apply() 方法:

    call()  的使用方式为 被调用的函数.call(调用者,参数1,参数2....),功能为:调用者调用被调用的函数,并传入参数列表。

    apply() 的使用方式为 被调用的函数.apply(调用者,参数组成的数组),功能为:调用者调用被调用的函数,并传入参数数组。

    call() 和 apply() 里面如果传入的第一个参数是 this ,表示的是函数的调用者。

    1 var store = {name:"myStore", id:5622};
    2 function getSalesVolume(a, b) {
    3     return a + b;
    4 }
    5 //store后面有两个参数
    6 getSalesVolume.call(store, 40000, 50000);//返回90000
    7 //store后面是一个参数数组,长度为2
    8 getSalesVolume.apply(store, [40000, 50000]);//返回90000

    二 返回值

    一个函数作为另外一个函数的参数,并最终返回一个值。

     1 //求最大值
     2 function getMax(a, b) {
     3     return a > b ? a : b;
     4 }
     5 //求最小值
     6 function getMin(a, b) {
     7     return a < b ? a : b;
     8 }
     9 //下面这个函数以函数作为参数,并最终返回一个值
    10 function getM(func, num1, num2) {
    11     return func(num1, num2);
    12 }
    13 getM(getMax, 1, 2);//返回2
    14 getM(getMin, 1, 2);//返回1

     getM() 的第一个参数是函数的名字,但是不能用双引号包含在内。

    三 高阶函数

    高阶函数的输入是函数,输出也是函数。即一个函数调用另外一个函数,然后返回一个新的函数。比如通过调用求两个数的最大值的函数,实现求n个数的最大值的函数,就可以用到高阶函数来实现:

     1 //求最大值
     2 function twoMax(a, b) {
     3      return a > b ? a : b;
     4 }
     5 function getMax(func) {
     6     return function() { //返回一个匿名函数
     7         var aLength = arguments.length;
     8         var result = 0;
     9         for (var i = 0;i < aLength;i++) {
    10             result = func.call(this, result, arguments[i]);
    11         }
    12         return result;
    13     };
    14 }
    15 var multiMax = getMax(twoMax);
    16 console.log(multiMax(1, 2, 3, 4));//输出4

    上面的 getMax() 函数在传入实参 twoMax() 函数后,会返回一个新的函数 multiMax() ,用来求多个数的最大值。getMax() 每次求两个数的最大值,然后再将这个最大值与第三个数比较,求最大值,这样一直进行下去,就可以求得多个数的最大值。

  • 相关阅读:
    MapReduce in MongoDB
    MongoDB的一些基本操作
    谈谈NOSQL
    Java中的反射(1)
    Mybatisの常见面试题
    关于Lombok和自动生成get set方法
    订Pizza(Java)
    美化Div的边框
    爱,死亡和机器人(Love,Death&Robots)
    session与cookie的介绍和两者的区别之其相互的关系
  • 原文地址:https://www.cnblogs.com/brucexiajun/p/9882318.html
Copyright © 2011-2022 走看看