JS`柯理化`
Posted 一星一辰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS`柯理化`相关的知识,希望对你有一定的参考价值。
JS柯理化
-
【百度】:把接受多个参数的函数变成单一参数的函数,并返回接受多个不同的参数且返回结果的新函数
-
【红宝书3】:使用一个闭包返回一个函数,当函数被调用时,返回的函数还需要设置一些传入的函数。
-
【犀牛书7】:操作函数的函数,它接受或多个函数作为参数并返回一个新函数。
-
柯里化是一种函数的转换,它是指将一个函数从可调用的
f(a, b, c)
转换为可调用的f(a)(b)(c)
。
使用场景特点:
- 参数复用
- 提前确认避免每次重复判断
- 延迟计算运行
function say(company, job, name) {
console.log(`我的公司是${company},工作岗位是${job},名字是${name}`);
}
say(\'阿里巴巴\',\'前端\',\'小米\');
say(\'阿里巴巴\',\'前端\',\'小明\');
say(\'阿里巴巴\',\'前端\',\'潇潇\');
//我的公司是阿里巴巴,工作岗位是前端,名字是小米
//我的公司是阿里巴巴,工作岗位是前端,名字是小明
//我的公司是阿里巴巴,工作岗位是前端,名字是潇潇
柯理化
function say(company, job) {
return function (name) {
console.log(`我的公司是${company},工作岗位是${job},名字是${name}`);
}
}
say(\'阿里巴巴\')
//ƒ (job) {
// return function (name) {
// console.log(`我的公司是${company},工作岗位是${job},名字是${name}`);
// }
// }
say(\'阿里巴巴\',\'前端\')
//ƒ (name) {
//console.log(`我的公司是${company},工作岗位是${job},名字是${name}`);
// }
say(\'阿里巴巴\')(\'前端\')
// 我的公司是阿里巴巴,工作岗位是undefined,名字是前端
say(\'阿里巴巴\',\'前端\')(\'小米\')
//我的公司是阿里巴巴,工作岗位是前端,名字是小米
再柯理化
function say(company) {
return function (job) {
return function (name) {
console.log(`我的公司是${company},工作岗位是${job},名字是${name}`);
}
}
}
say(\'阿里巴巴\')
//ƒ (job) {
// return function (name) {
// console.log(`我的公司是${company},工作岗位是${job},名字是${name}`);
// }
// }
say(\'阿里巴巴\')(\'前端\')
//ƒ (name) {
//console.log(`我的公司是${company},工作岗位是${job},名字是${name}`);
// }
say(\'阿里巴巴\')(\'前端\')(\'小米\')
//我的公司是阿里巴巴,工作岗位是前端,名字是小米
let setcompany = say(\'阿里巴巴\')(\'前端\');
setcompany(\'小米\');
setcompany(\'潇潇\');
setcompany(\'小明\');
//我的公司是阿里巴巴,工作岗位是前端,名字是小米
// 我的公司是阿里巴巴,工作岗位是前端,名字是潇潇
//我的公司是阿里巴巴,工作岗位是前端,名字是小明
封装柯理化函数:
//被柯理化的函数
function curry(fn) {
//记录fn的参数个数
let len = fn.length;
return function temp() {
// 收集本地的传递参数
let args = [...arguments];
if (args.length >= len) {
return fn(...args)
} else {
return function () {
return temp(...arg, ...arguments)
}
}
}
}
以上是关于JS`柯理化`的主要内容,如果未能解决你的问题,请参考以下文章