JavaScripts之柯里化与偏函数
参考资料:https://github.com/mqyqingfeng/Blog/issues/42
柯里化(Currying):
定义:柯里化是表示将某个多参数的函数转换为一系列只有一个参数的函数的技术。
优点:
1. 参数复用
2. 延迟执行
3. 函数式编程(具体没有深入了解)
缺点:由于 柯里化 离不开使用 闭包、arguments、递归,会产生额外的开销
1. 闭包:会导致变量都会存储在内存中,无法被GC回收,管理不当容易造成内存泄漏
2. arguments 存储慢、访问性差
3. 递归执行效率低
实例:
// 实现一个柯里化函数 function curry(fn) { const args = arguments[1] || [] return function (arg) { arg && args.push(arg) // 这里也可以对 fn.length 与 args.length 进行判断,若长度相等则自动执行 if(!arg) { return fn.apply(this, args) } return curry.call(this, fn, args) } } function sum (a, b, c) { return a + b + c } const curryFn = curry(sum) // 参数复用 延迟执行 let c = 1 const fn1 = curryFn(1, 2) console.log(fn1(c)()) // 输出 -> 4 c++ // 这里 a=1,b=2 参数就复用了 const fn2 = fn1(c) // fn1(c) 返回的是一个可执行函数,我们没有直接进行调用,延迟执行(当然也可以当参数数量满足条件时自动执行) console.log(fn2()) // 输出 -> 5
偏函数(局部应用):
定义:将一个有n个参数的函数(n元函数)转换为 n - x 个参数的函数(n - x 元函数)
作用:可以为一些某些参数为固定的函数提供一个函数变体,调用更简单
实例:
// 简单的偏函数实现 function partial(fn) { const _args = [].slice.call(arguments, 1) return function() { _args.push(...arguments) if(_args.length >= fn.length ){ return fn.apply(this, _args) } return partial(fn, ..._args) } } function add (a, b, c) { return a + b + c } // 我们将 add(a, b, c) ->转化为了 newAdd(b, c) // newAdd 就是一个偏函数 const newAdd = partial(add, 1) console.log(newAdd(2, 3))
柯里化与偏函数区别:
柯里化是将 n元函数 转换为 n个1元参数, 而偏函数是将 n 元函数 转换为 n - x 个参数(n元函数:n个参数的函数;n - x:n个参数 减去 x个参数)