目录
一、引入柯里化
大多数同学初次遇到柯里化都是在这几道面试题当中。
实现一个函数功能:sum(1,2,3,4…n)转化为 sum(1)(2)(3)(4)…(n)
实现一个add方法,使计算结果能够满足如下预期: add(1)(2)(3) = 6; add(1, 2, 3)(4) = 10; add(1)(2)(3)(4)(5) = 15;
防抖和节流也是柯里化,手写防抖节流,手写反柯里化。
二、柯里化的含义
什么叫柯里化呢?
先介绍一个小的知识点:
高阶函数——>偏函数——>柯里化(包括的关系)
高阶函数:其中一个特点是可以暂存变量(∵内部有闭包)
偏函数:返回一个函数,函数的参数不止一个。
柯里化:把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数。(官方解释永远都是一下给你干懵,别急看完这一部分就明白了)
柯里化就是让一个函数变得更具体一些,就是使函数的作用效果变得更小。把一个函数传递多个参数完成的事情改变成一个函数传递一个参数的多个函数形式。 原则上返回的一个函数只能接收一个参数,但多个参数我们通常也叫柯里化。
【这里举个例子解释一下👇】
// 1. 我们先写一个判断数据类型的函数,返回值为Boolean
function isType(type,value){
return Object.prototype.toString.call(value) === `[object ${type}]`
}
console.log(isType('String','chailo'))
console.log(isType('Number',123))
// 2. 接下来对函数修改,返回值为函数
function isNewType(type){
return function(value){
Object.prototype.toString.call(value) === `[object ${type}]`
}
}
let isString = isNewType('String')
let isNumber = isNewType('Number')
console.log(isString('chailo'))
console.log(isNumber(123))
// 以前函数使检测各种类型变量的变量类型,现在就是只检测它是不是String类型,这个过程就是使函数更具体的过程。
怎么就使函数更具体了呢?
上面呢只是一个栗子,使函数具体的过程就是函数柯里化的过程,这个过程就是对函数参数进行处理的过程。我们再来品味刚刚的官方解释,相信一下子就明白在表达什么。通俗理解:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。
为什么要柯里化呢?
可能你就会问,折腾了这么半天的目的是什么呢?感觉代码还变多了呢,本来可以一步到位的事情。之前我