《JavaScript应用程序设计》一一2.16 偏函数应用与函数加里化

简介:

本节书摘来华章计算机出版社《JavaScript应用程序设计》一书中的第2章,第2.16节,作者:Eric Elliott 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.16 偏函数应用与函数加里化

偏函数应用是指将一个拥有多个参数的原函数包裹,随后返回一个接受少量参数的新函数。它将参数存放在闭包中,所以在调用时只需提供那些未确定的参数。假设你有一个名为multiply()的函数,它接受两个参数x与y,当你发现在使用multiply()时,其中一个参数通常是固定的,你可以对其使用偏函数应用技术:

var multiply = function multiply(x, y) {
    return x * y;
  },

  partial = function partial(fn) {
    // Drop the function from the arguments list and
    // fix arguments in the closure.
    var args = [].slice.call(arguments, 1);

    // Return a new function with fixed arguments.
    return function() {
      // Combine fixed arguments with new arguments
      // and call fn with them.
      var combinedArgs = args.concat(
        [].slice.call(arguments));
      return fn.apply(this, combinedArgs);
    };
  },

  double = partial(multiply, 2);

test('Partial application', function () {
  equal(double(4), 8,
    'partial() works.');
});

在ES5规范中,你可以使用Function.prototype.bind()方法制造偏函数。此方法唯一的缺点是当你使用call()或者apply()调用函数时,不能重写函数内部this指向。如果你的函数中this有明确的指向,建议你不要使用bind()方法,下面演示了用bind()方法生成multiply函数的偏函数。

var boundDouble = multiply.bind(null, 2); // null context

test('Partial application with bind', function () {
  equal(boundDouble(4), 8,
      '.bind() should allow partial application.');
});

可能你听说过“函数加里化”这个术语,这两者经常容易被弄混淆。不同之处在于,函数加里化是将一个接受多个参数的函数转变为一组支持链式调用的函数链,其中每个函数仅有一个入参。
例如,函数add(1,2,3)在经过加里化后调用方式将变为add(1)(2)(3),每一次调用都在前一次函数执行的结果之上,这个概念在lambda calculus中十分重要。然而,由于JavaScript函数本身支持传入多个参数,所以函数加里化在多数JavaScript应用中较为少见。

相关文章
|
24天前
|
JavaScript
变量和函数提升(js的问题)
变量和函数提升(js的问题)
|
24天前
|
JavaScript
常见函数的4种类型(js的问题)
常见函数的4种类型(js的问题)
11 0
|
24天前
|
JavaScript
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
10 0
|
1月前
|
自然语言处理 JavaScript 网络架构
js开发:请解释什么是ES6的箭头函数,以及它与传统函数的区别。
ES6的箭头函数以`=>`定义,简化了函数写法,具有简洁语法和词法作用域的`this`。它无`arguments`对象,不能用作构造函数,不支持`Generator`,且不改变`this`、`super`、`new.target`绑定。适用于简短表达式,常用于异步编程和高阶函数。
18 5
|
1月前
|
开发框架 前端开发 JavaScript
使用JavaScript、jQuery和Bootstrap构建待办事项应用
使用JavaScript、jQuery和Bootstrap构建待办事项应用
13 0
|
1月前
|
JavaScript 前端开发 网络架构
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
18 1
|
1月前
|
前端开发 JavaScript 数据处理
在JavaScript中,什么是异步函数执行的例子
在JavaScript中,什么是异步函数执行的例子
10 0
|
1月前
|
自然语言处理 JavaScript 前端开发
探索JavaScript中的闭包:理解其原理与实际应用
探索JavaScript中的闭包:理解其原理与实际应用
19 0
|
1月前
|
JavaScript
JS封装节流函数
JS封装节流函数
15 0
|
1月前
|
JavaScript 前端开发 算法
js开发:请解释什么是虚拟DOM(virtual DOM),以及它在React中的应用。
虚拟DOM是React等前端框架的关键技术,它以轻量级JavaScript对象树形式抽象表示实际DOM。当状态改变,React不直接操作DOM,而是先构建新虚拟DOM树。通过高效diff算法比较新旧树,找到最小变更集,仅更新必要部分,提高DOM操作效率,降低性能损耗。虚拟DOM的抽象特性还支持跨平台应用,如React Native。总之,虚拟DOM优化了状态变化时的DOM更新,提升性能和用户体验。
24 0