知食记
搜索文档…
知食记
思维导图
归档
博客
🎃CSS
CSS基础
CSS3
SCSS
🎉JavaScript
JS 概念
类型
类型转换
内存
原型链
继承
词法作用域
事件委托
Falsy
This
闭包
Event-loop
跨域
function.length
arguments
!!
void 0
柯里化1
柯里化2
异常
协程
JS陷阱
JS开发知识点
实现JS常见函数
实现JS 常见操作函数
JS Worker
ES6
ES6 函数
Typescript
V8
🕹️框架
Vue
Vue3
React
React-Redux
React Hooks
Nuxt
Koa2
🎯算法
算法与数据结构
🎁HTML
DOM
SVG
🏈计算机网络
浏览器
计算机网络
🥊前端生态
Webpack
Babel
Fetch
Axios
Npm
Yarn
业务开发
微前端
Hexo
🏀后端
Node
Java
Python
🕹️面试
面试真经
To-do
🤖开源
开源项目
🧸其他
Linux
Git
正则
设计模式
计算机理论
Group 1
由
GitBook
提供支持
柯里化1
柯里化
, 即
Currying
的音译。
Currying
为实现多参函数提供了一个递归降解的实现思路——
把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数。
下面尝试对最简单的加法函数进行柯里化改造
function
add
(
x
,
y
)
{
return
(
x
+
y
)
}
第一层
function
curriedAdd
(
x
)
{
return
function
(
y
)
{
return
x
+
y
}
}
当然以上实现是有一些问题的:它并不通用,并且我们并不想通过重新编码函数本身的方式来实现
Currying
化。
第二层
function
currying
(
fn
,
...
args1
)
{
return
function
(
...
args2
)
{
return
fn
(
...
args1
,
...
args2
)
}
}
var
increment
=
currying
(
add
,
1
)
在此实现中,
currying
函数的返回值其实是一个接收剩余参数并且立即返回计算值的函数。
即它的返回值并没有自动被 Currying化 。所以我们可以通过递归来将 currying 的返回的函数也自动 Currying
化。
第三层
function
trueCurrying
(
fn
,
...
args
)
{
if
(
args
.
length
>=
fn
.
length
)
{
return
fn
(
...
args
)
}
return
function
(
...
args2
)
{
return
trueCurrying
(
fn
,
...
args
,
...
args2
)
}
}
以上的思想为
比较多次接受的参数总数与函数定义时的入参数量,当接受参数的数量大于或等于被 Currying 函数的传入参数数量时,就返回计算结果,否则返回一个继续接受参数的函数。
const
curriedAdd
=
trueCurring
(
add
)
curriedAdd
(
1
,
2
)
// 3
curriedAdd
(
1
)(
2
)
// 3
柯里化优势
1.
多参函数复用性
2.
函数式编程而生
柯里化劣势
1.
一些特性有其他解决方案
如果我们只是想提前绑定参数,那么我们有很多好几个现成的选择,bind,箭头函数等,而且性能比Curring更好。
以前
void 0
下一个
柯里化2
最近更新
2yr ago
复制链接
大纲
第一层
第二层
第三层
柯里化优势
柯里化劣势