一文搞懂JavaScript函数柯里化

443 阅读1分钟

浮云一别后,流水十年间。——韦应物

函数柯里化

01_理解

function foo(a,b,c,d){
	return a+b+c+d
}

foo(10,20,30,40)

//============上面变成下面的过程就是函数柯里化=============

function bar(a){
	return function(b){
		return function(c){
			return function(d){
				a+b+c+d
			}
		}
	}
}

bar(10)(20)(30)(40)

// 简化柯里化过程(箭头函数)
var curryFn = x => y => z => console.log(x + y + z);
curryFn(10)(20)(30)

02_柯里化的优点

1)单一职责的原则

每个函数负责自己的业务代码,以免太对于复杂不好维护和代码冗余

function foo(a,b,c){
  a = a+2
  b = b*2
  c = c*c
  return a + b + c 
}

console.log(foo(1,2,3));

//柯里化的优点:单一职责每个函数负责自己的业务代码,以免太对于复杂不好维护和代码冗余
function bar (a){
  a = a + 2
  return function(b){
    b = b* 2
    return function(c){
      c  = c * c
      return a + b + c 
    }
  }
}
console.log(bar(1)(2)(3));

2)参数定义复用-1

//实现固定的一个数字与其它数字进行相加
function makeAdder(count){
  count = count * count
  return function(num){
    return count + num
  }
}

let count = makeAdder(5)
console.log(count(10));

3)参数定义复用-2

function searchGoods(date,type,price){
console.log(`${date.getHours()}:${date.getMinutes()}---${type}---¥${price}`);
 }

searchGoods(new Date(),"phone","3000")



//柯里化优化
let searchGoods = date => type => price =>  console.log(`${date.getHours()}:${date.getMinutes()}---${type}---¥${price}`);

searchGoods(new Date())("phone")("3000")

/*
	参数复用 
		1.每次都需要传入new Date(),可以利用柯里化优化逻辑复用
		2.每次固定查询一个类型
		3.每次固定查询一个价位
*/
let dateSearcher = searchGoods(new Date())
dateSearcher("Phone")("2000")

let phoneSearcher = searchGoods(new Date())("phone")
phoneSearcher("1000")