javascript多箭头和函数柯里化

高阶函数

高阶函数是至少知足如下条件之一的函数:javascript

  • 函数能够做为参数被传递;
  • 函数能够做为返回值输出。

举几个例子,js中的排序函数sort,就是函数做为参数的一个高阶函数。java

// 从小到大
[1,5,8,6,9,0].sort(function(a, b){
  return a - b;
})
// [0,1,5,6,8,9]

//从大到小
[1,5,8,6,9,0].sort(function(a, b){
  return b - a;
})
// [9,8,6,5,1,0]
复制代码

js中判断数据类型的,就是函数做为返回值。es6

const isType = function(type){
  return function(obj){
    return object.prototype.toString.call(obj) === `[object ${type}]`;
  }
}
let isNumber = isType('Number');
console.log(isNumber(20)); // true
复制代码

函数柯里化

函数柯里化(function currying)概念最先是由俄国数学家Moses Schönfinkel发明出来,后由数学家Haskell Curry丰富和发展,currying由此得名。编程

currying又称部分求值。一个currying函数首先会接收一些参数,接受了这些参数以后,该函数并不会当即求值,而是继续返回另外一个函数,刚才传入的参数在函数形式的闭包中 被保存起来。待到函数真正须要求值的时候,以前传入的因此参数都会被一次性用于求值。闭包

下面来看一个最简单的计费函数:app

let totalCost = 0;
let billing = function(num){
  totalCost += num;
};

billing(20);
billing(12);
billing(64);
billing(16);
console.log(totalCost); //112
复制代码

经过这段代码咱们能够计算出某时间段的费用,然而这段代码有两个弊端,一是在外部暴露了一个全局变量,容易致使变量污染;二是咱们并不关心天天花费多少,并不想每次花费都计算一次,而是 但愿在最后须要计算时在所有作计算。接下来咱们改进代码,用currying实现效果。函数式编程

let totalCost = (function(){
  let args = [];
  return function(){
    if(arguments.length === 0){
      let money = 0;
      for(let i = 0, l = args.length; i < l; i++){
        money += args[i];
      }
      return money;
    }else{
      [].push.apply(args, arguments);
    }
  }
})();

totalCost(12);
totalCost(62);
totalCost(15);
console.log(const()); // 89
复制代码

多箭头函数

多箭头函数其实就是函数柯里化的es6写法,好比咱们常见的求和函数,采用高阶函数的写法:函数

function sum(a){
  return function(b){
   return a + b;
  }
}

let addLater = sum(3);
console.log(addLater(5));  //8
复制代码

采用es6对箭头的写法等价于:let sum = a => b => a + b;ui

wiki 的柯里化定义: 把接受多个参数的函数变换成接受一个单一参数的函数,而且返回(接受余下的参数并且返回结果的)新函数的技术spa

简单的理解就是,把第一个参数变量存在了函数(闭包)里面,而后须要n个参数就变成了须要n-1个参数就能够调 用函数了。例如上面的案例:

let sum = a => b => a + b;
let sum2 = sum(2);
复制代码

原本完成sum操做应该是:

let sum = (a, b) => x + y;
复制代码

它须要俩参数,而上面的sum函数完成一样操做只须要一个参数,这在函数式编程中普遍应用。

详细解释一下,就是sum函数等价于有了x这个闭包变量的y => x + y函数。

也所以当a = 2,而后再调用sum2(5)时:

sum(5) ==== 2 + 5
复制代码

函数柯里化有两个功能:一是能够惰性求值;二是能够提早传递部分参数。

相关文章
相关标签/搜索