柯里化定义
提前接收部分参数,延迟执行,不立即输出结果,而是返回一个接受剩余参数的函数
实现柯里化
function add(x, y, z) {
return x + y + z
}
const curr = (fn, ...args) => fn.length === args.length ? fn(...args) : (..._args) => curr(fn, ...args, ..._args)
const addCurr = curr(add)
console.log(addCurr(1, 2, 3)) // 6
console.log(addCurr(1)(2)(3)) // 6
console.log(addCurr(1, 2)(3)) // 6
代码分析
function add(x, y, z) {
return x + y + z
}
// 柯里化之后
function a(x) {
return function b(y) {
return function c(z) {
return x + y + z
}
}
}
在使用柯里化之后的变化,之前是传入全部参数,只调用一次。现在是传入部分参数,延迟执行,返回一个接收剩余参数的函数。这样的好处是可以延迟执行,可以参数复用。但是每创建一个function,都是要开辟内存空间的,你这样无线开下去,用柯里化还有什么意义呢? 所以要权衡功能和性能
过程分析
1. 柯里化是每次返回一个函数去处理剩余的参数
(..._args) => curr(fn, ...args, ..._args)
2. 等处理完剩余参数,那就该执行这个柯里化函数了,判断条件就是
fn.length === args.length
demo分析
- bind实现(延迟执行)
Function.prototype._bind = function (context, ...args) {
let that = this
return function () {
return that._call(context, ...args)
}
}
bind的实现,就是用了柯里化的思想,延迟执行
- 参数复用
function url_curr(protocol) {
return function (hostname, pathname) {
return `${protocol}${hostname}${pathname}`
}
}
const url_http = url_curr('https://') //参数复用
const url1 = url_http('www.baidu', '/界面')
const url2 = url_http('www.头条', '/首页')
console.log('url1', url1)
console.log('url2', url2)
有相同的参数,可以实现参数复用