理解科里化函数(currying)
英文是咖喱的意思,咖喱就是碾碎所有的佐料的混合物,制作过程我们需要将佐料一样一样的放入当中,柯里化就是这样的东西,将参数按照顺序排队进入,而不是一次性输入所有参数,所以柯里化函数专门用于做数据的混合,并且柯里化函数可以利用闭包来存储数据等到需要的时候拿出来使用。
柯理化函数:
- 闭包函数的高阶应用
- 作用就是通过延长变量的生命周期, 来吧一个函数传递多个参数完成的事情
- 改变成一个函数传递一个参数, 的多个函数形式
标准样式案例
需求:
- 两个数字 和 一个符号作为 参数
- 根据符号进行两个数字的不同运算
- 数字不变, 符号在改变
function curry(){
var arr=[];
return function(){
if(arguments.length>0){ //判断是否有参数
arr=[].concat.apply(arr,arguments);
}
return arr.reduce((value,item)=>value+item); //求和
}
}
function fn(a, b) {
return function inner(type) {
let res
switch (type) {
case '+': res = a + b; break;
case '-': res = a - b; break;
case '*': res = a * b; break;
case '/': res = a / b; break;
}
return res
}
}
// f 接受到的就是 inner 函数
var f = fn(100, 200)
console.log(f('+'))
console.log(f('-'))
console.log(f('*'))
console.log(f('/'))
柯里化的常见应用场景:
封装表单验证
+ 一个网站里面密码验证(格式的)会有多少次 ?
=> 登录, 注册, 修改密码, 修改个人资料
计算折扣价格时
+ 在计算折扣的时候无需每次都带上参数
- 补充给个案例 这里使用了柯里化保存参数,并且使用了promise来封装,方便后续使用
- 这是一个操作mysql数据库的方法
// db.js 只是负责连接数据库, 向外暴露一个连接信息
const mysql = require('mysql')
// 创建连接池
const db = mysql.createPool({
host: 'localhost',
port: 3306,
user: 'root',
password: 'root',
database: 'root'
})
exports.db = db
const { db } = require('./db')
const select = function (sql) {
return function (params = []) {
return new Promise((resolve, reject) => {
db.query(sql, params, (err, data) => {
if (err) return reject(err)
resolve(data)
})
})
}
}
const db = require('./db_crud')
const selectUser = db.select('SELECT * FROM `student` LIMIT ?, 10')
const deleteById = db.delete('DELETE FROM `users` WHERE `id`=?')
module.exports = {
selectUser: selectUser,
deleteById: deleteById
}
使用时,直接导入该模块
const abc=require(...)
acc.selectUser([参数]).then(res=>{console.log(res}) 即可