柯里化

一。柯里化(curry )的 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

二。具有通用性和高适用。

三。常见作用:1、参数复用。2、提前返回。3、 延迟计算/运行

四。实例。

 (1)参数复用:

function add(a) {
  return function (b) {
    return function (c) {
      return a + b + c
    }
  }
}

let add1 = add(1)
console.log(add1(2)(3)) // 6
console.log(add1(4)(5)) // 10
let add2 = add1(2)
console.log(add2(4)) // 7
console.log(add2(5)) // 8

如上面代码里面的add1就是复用参数:1,而add2则复用了参数:1和2两个参数。
(2)提前返回。

var addEvent = (function(){
    if (window.addEventListener) {
        return function(el, sType, fn, capture) {
            el.addEventListener(sType, function(e) {
                fn.call(el, e);
            }, (capture));
        };
    } else if (window.attachEvent) {
        return function(el, sType, fn, capture) {
            el.attachEvent("on" + sType, function(e) {
                fn.call(el, e);
            });
        };
    }
})();

addEvent('span', 'click', function () {}, false)
addEvent('div', 'click', function () {}, false)
addEvent('p', 'click', function () {}, false)
addEvent('div', 'dblclick', function () {}, false)

如上面代码对于监听事件的判断则只会走一次,如果是传统函数则会多次执行。则真是提前返回的好处。

(3)延迟计算/运行

let allScore = 0
let curryScore = function (fn) {
  let allScore = []
  return function () {
    if (arguments.length === 0) {
      return fn.apply(null, allScore)
    } else {
      allScore = allScore.concat([].slice.call(arguments))
    }
  }
}

let curryAddScore = curryScore(function (...val) {
  for (let i = 0; i < val.length; i++) {
    allScore += val[i]
  }
})

curryAddScore(2)
curryAddScore(3)
curryAddScore(1)
console.log(allScore)
curryAddScore(3)
curryAddScore()
console.log(allScore)

如上面代码只有在参数传递完成时才会进行统计。这就是延迟计算/运行的结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值