Js柯里化

2018-11-19  本文已影响0人  吃萝卜的小兔子

柯里化:函数接受一些参数,但不立即求值;返回一个匿名函数将参数保存下来;需要求值时将保存的全部参数一起用掉。(保存时穿参/求值时不传参)。

举个栗子:Js中用bind()函数实现

function foo(a, b, c) {
  console.log("a:" + a + ",b:" + b + ",c" + c)
}
var ∅ = Object.create()  //创建空对象,不带property
foo.apply(∅, [1, 2, 3])   // a:1 b:2 c:3

var bar = foo.bind(∅, 2)
bar(3,4)  // a:2 b:3 c:4

解释: 固定第一个参数a:2 剩下的b,c通过传参赋值

或者:

function foo(...args) {
  console.log("a:" + args[0] + ",b:" + args[1]+ ",c" + args[2])
}
var ∅ = Object.create()  //创建空对象,不带property
var bar = foo.bind(∅, 2)
bar(3,4)  // a:2 b:3 c:4

举个栗子:求一个月中每一天的花销总和(每天的花销不重要,只求最后的。)

var cost = (function() {
  var money = 0;
  return function() {
    for(var i=0; i<arguments.length; i++) {
      money += arguments[i]
    }
    return money
  }
})();

var currying = function(fn) {
  var args = [];
  return function() {
    if(arguments.length === 0) {
      return fn.apply(this, args);
    } else {
      [].push.apply(args, arguments);
      return arguments.callee;
    }
  }
};

var cost = currying( cost ) //柯里化


cost(100);
cost(200);
cost(300); // 不求值

console.log( cost() ); // 求值 600

上一篇下一篇

猜你喜欢

热点阅读