这一次来学习一下Partial Application。我们先看一下函数的介绍,在维基上有简单的介绍:

在数学中,一个函数是描述每个输入值对应唯一输出值的这种对应关系,符号为 f(x)。例如,表达式 f(x)=x2表示了一个函数 f,其中每个输入值x都与唯一输出值x2相联系。因此,如果一个输入值为3,那么它所对应的输出值为9。而g(x,y) = xy有两个参量xy,以乘积xy为值。

  上面描述了函数(为方便假设x,y都是int),并且给出了函数的两个例子,先换一种方式来看,f(x)可以表示为:x -> y(x2),即经经过f到x2的映射,写成 int -> int。接受一个int 返回一个int。再看g(x,y)可以表示为:x -> y -> z(xy)。即x,y经过g的映射到z,写成 int -> int -> int。我们看g(x,y)函数,用javascript来实现一下:

function g(x,y){return x*y;
}

  很完美啊,很接近数学定义。它依次接受两个参数,x与y。并且返回它们两个的乘积。但是当x是个常数,比如x=n(n是一个自然数)。那么g(n,y)=ny。这就变成一个常数与一个变量的乘积,它接受一个参数y返回ny,即y -> z(ny) 的映射,写成 int -> int。因此,我们可以这样来理解上面的工作,g(x,y)是接受一个参数int,并且返回一个函数 int ->int 。这个返回的函数只接受一个int 并且返回一个int。来用javascript表示一下:

var h = g(2);

  这里的h表示函数h(y)=2y。这样就有h(5)=10,h(13)=26等。

h(5);
h(13);

  这个技术是把需要多个参数的函数形式转变为接受单个参数的函数链,它通常叫做Curring,这是为了纪念Haskell Curry而起的名字,但他并不是第一个提出的1。但是很遗憾的是javascript并不支持这样的特性。所以要实现这样的特性需要做一些工作,这些工作并不复杂。主要是把参数存储起来,等待调用函数链上的下一个函数时拿出前边参数继续传递给链上的下一个函数,直到最后得到返回值。先看一下下面的代码:

 1 function atarr(a,index){
 2     var index=index||0,args = new Array(a.length - index);
 3     for(var i in a){
 4         if(i>=index) args[i-index]=a[i];
 5     }
 6     return args;
 7 }
 8 function m(scope,fn){
 9     if(arguments.length<3) return fn.call(scope);
10     var p = atarr(arguments,2);
11
12     return function(){
13         var args = atarr(arguments);
14         return fn.apply(scope,p.concat(args));
15     }
16 }

  测试代码:

 1 var plus = function(a,b){
 2     return a+b;
 3 };
 4 var plus2 = m(null,plus,2);
 5 console.log(plus2(10));
 6 console.log(plus2(0));
 7
 8 //结果
 9 12
10 2

  这样我们的目标已经实现啦。在上面的atarr函数是将arguments对象中指定位置开始的参数取出并且保存到一个数组中。m函数就是主角,它完成了前面定义的任务,实现了保存函数链上的参数并且返接受余下参数的函数。测试代码中的plus函数原先接受a,b两个参数并返回a与b之和,即 int -> int -> int,而plus2则变成了接受一个参数b与2相加,并返回2与b之和,即 int -> int。
  通过上面的一些工作,我们实现了javascript中的Partial Application,在dojo框架中hitch2实现了域绑定和partial。有兴趣可以读一下它的源码,也是非常简单明了的。

1.Curring:来自维基百科 Curring。
2.来自dojo toolkit,参见hitch。

转载于:https://www.cnblogs.com/mike442144/archive/2013/01/10/2853940.html

javascript之Partial Application相关推荐

  1. 使用C#体验函数式编程之——Partial application(局部应用)

    函数式编程 函数式编程是一种编程范式,着力于避免共享状态.可变数据和副作用产生,函数是第一等公民. 这与面向对象编程相反,在面向对象编程中,应用程序状态通常与对象中的方法共享和共存. 函数式编程是声明 ...

  2. 使用Javascript 获得Word application的版本号

    在webclient的UI view html page里使用如下source code: <%@page language="abap" %> <%@exten ...

  3. SharePoint JavaScript API in application pages

    前言 最近,在SharePoint 应用程序页中写JavaScript API,进行一些数据交互.其实,很简单的事情却遇到了问题,记录一下,希望能对遇到类似问题的人以帮助. 引用JavaScript ...

  4. javascript功能_功能性JavaScript简介

    javascript功能 Hey everybody! I've written a book called Discover Functional JavaScript, and it's now ...

  5. javascript里的偏函数——本质函数式编程+闭包,返回函数

    最终效果: var greet = function(greeting, name) {return greeting + ' ' + name; };var sayHelloTo = _.parti ...

  6. JavaScript的几个概念简单理解(深入解释见You Don't know JavaScript这本书)

    ES201X是JavaScript的一个版本. ES2015新的feature let, const Scope, 块作用域 Hoisting Closures DataStructures: Obj ...

  7. 三个值得期待的JavaScript新功能!

    让我们来看看JavaScript中一些有用的即将推出的功能.您将看到他们的语法,链接以及时了解他们的进度,我们将编写一个小型测试套件,以展示如何立即开始使用这些提案! JavaScript是如何更新迭 ...

  8. 高效管理ASP.NET的JavaScript库

    简介 对于ASP.NET开发人员来说,管理项目中的JavaScript都很随意: 我想这很大程度上可能是因为网上没有如何妥善处理ASP.NET中JavaScript的可靠信息.此文的目的就是提供一种最 ...

  9. JavaScript 专题之函数柯里化

    JavaScript 专题系列第十三篇,讲解函数柯里化以及如何实现一个 curry 函数 定义 维基百科中对柯里化 (Currying) 的定义为: In mathematics and comput ...

最新文章

  1. java.io.IOException: No FileSystem for scheme: hdfs
  2. 基于运算放大器的线性稳压器
  3. 《CSS揭秘》-背景与边框
  4. MySQL面试题 数据库设计三范式
  5. nodejs库express是如何接收inbound json请求的
  6. mysql定时导入_MySQL导入、导出、数据库定时备份
  7. [詹兴致矩阵论习题参考解答]习题1.13
  8. Leetcode每日一题:53.maximum-subarray(最大子序和)
  9. struts config xml详细解释
  10. Mongoose使用——nodejs结合mongodb
  11. 一阶惯性加纯滞后模型matlab代码,一种镇定一阶惯性加纯滞后系统的线性自抗扰控制器设计方法与流程...
  12. ps怎么把模糊的图片变清楚
  13. 给IT新人的15点建议:苦逼程序员的辛酸反省与总结
  14. fstream的使用详解
  15. Windows自带的加密算法Crypto实现MD5, AES256以及RSA算法
  16. Python 解密 pdf 文件
  17. 试商法 素数探求 c语言,连续合数探求
  18. 中国移动物联网公司未来的发展靠什么?
  19. 爪哇国政府有个绑架局
  20. 外媒关注中国富人外国“抢房”:腰缠万贯全现付

热门文章

  1. 机器学习笔记(十六):大规模机器学习
  2. phpstudy mysql5.1_linux下mysql5.1 和 5.7安装教程详解
  3. python缺少标准库_Python 实现自动导入缺失的库
  4. TCP与UDP的区别(未完成,待补充)
  5. leecode5 最长回文子串
  6. 栈/队列 互相模拟实现
  7. 2020年mysql中级课程一天一小时
  8. how to learn html5,HTML5与CSS基础
  9. post方法就反回了一个string字符串前台怎么接_Golang Web入门(2):如何实现一个RESTful风格的路由...
  10. C++使用openssl实现aes加解密,其中加密是string到文件,解密是文件到string,切合项目背景