柯里化

255 阅读1分钟

柯里化定义

提前接收部分参数,延迟执行,不立即输出结果,而是返回一个接受剩余参数的函数

实现柯里化

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分析

  1. bind实现(延迟执行)
Function.prototype._bind = function (context, ...args) {
    let that = this
    return function () {
        return that._call(context, ...args)
    }
}

bind的实现,就是用了柯里化的思想,延迟执行

  1. 参数复用
 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)

有相同的参数,可以实现参数复用