javascript之Partial Application学习_javascript技巧

这一次来学习一下Partial Application。我们先看一下函数的介绍,在维基上有简单的介绍:
在数学中,一个函数是描述每个输入值对应唯一输出值的这种对应关系,符号为 f(x)。例如,表达式 f(x)=x2表示了一个函数 f,其中每个输入值x都与唯一输出值x2相联系。

因此,如果一个输入值为3,那么它所对应的输出值为9。而g(x,y) = xy有两个参量x和y,以乘积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并不支持这样的特性。所以要实现这样的特性需要做一些工作,这些工作并不复杂。主要是把参数存储起来,等待调用函数链上的下一个函数时拿出前边参数继续传递给链上的下一个函数,直到最后得到返回值。先看一下下面的代码:

复制代码 代码如下:

function atarr(a,index){
var index=index||0,args = new Array(a.length - index);
for(var i in a){
if(i>=index) args[i-index]=a[i];
}
return args;
}
function m(scope,fn){
if(arguments.length<3) return fn.call(scope);
var p = atarr(arguments,2);
return function(){
var args = atarr(arguments);
return fn.apply(scope,p.concat(args));
}
}

测试代码:

复制代码 代码如下:

var plus = function(a,b){
return a+b;
};
var plus2 = m(null,plus,2);
console.log(plus2(10));
console.log(plus2(0));
//结果
12
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。有兴趣可以读一下它的源码,也是非常简单明了的。

时间: 2024-09-28 03:37:38

javascript之Partial Application学习_javascript技巧的相关文章

新手快速学习JavaScript免费教程资源汇总_javascript技巧

"JavaScript"的名头相信大家肯定是耳熟能详,但只有一小部分人群了解它的使用与应用程序构建方式.这"一小部分"人指的当然是技术过硬的有为青年.网络程序员以及IT专业人员.但对于一位新手或者说外行人而言,"JavaScript"只不过是复杂计算机编程学科当中的另一个不知所云的术语. 那么,JavaScript到底是什么? 如果各位拥有在计算机领域的工作经验,那么绝对不能错过强大的JavaScript. 它是知名度最高的Web页面脚本语言.它

详细讲解JavaScript中的this绑定_javascript技巧

this 可以说是 javascript 中最耐人寻味的一个特性,就像高中英语里各种时态,比如被动时态,过去时,现在时,过去进行时一样,无论弄错过多少次,下一次依然可能弄错.本文启发于<你不知道的JavaScript上卷>,对 javasript 中的 this 进行一个总结. 学习 this 的第一步就是明白 this 既不是指向函数自身也不指向函数的作用域.this 实际上是在函数被调用时发生的绑定,它指向什么地方完全取决于函数在哪里被调用. 默认绑定 在 javascript 中 ,最常

javascript编程异常处理实例小结_javascript技巧

本文实例总结了javascript编程异常处理的方法.分享给大家供大家参考,具体如下: 前言:在前一篇<asp.net开发中常见公共捕获异常方式总结>,我们整理总结了asp.net服务端的异常处理.这一篇接着前文,简单总结并讨论一下javascript在客户端的异常处理.这样asp.net的服务端和客户端异常处理我们就都有了初步的认识. 1.烦人的脚本错误 楼猪经常装13,但是普遍都没有深度.偶然艰难地看懂了一段英文,终于可以深沉地再装一回: When browsing Web pages o

java、javascript实现附件下载示例_javascript技巧

在web开发中,经常需要开发"下载"这一模块,以下给出一个简单的例子. 在服务器端,使用java开发: @RequestMapping(value = "download.html", method = RequestMethod.GET) public void download(String resourceid, HttpServletRequest request, HttpServletResponse response) { response.setCo

学习JavaScript设计模式之迭代器模式_javascript技巧

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. JavaScript中的Array.prototype.forEach 一.jQuery中的迭代器 $.each([1, 2, 3], function(i, n) { console.log("当前下标为:"+ i + " 当前元素为:"+ n ); }); 二.实现自己的迭代器 var each = function(ary, callback) { for(var i

学习JavaScript设计模式之代理模式_javascript技巧

明星都有经纪人作为代理.如果请明星办一场商演,只能联系其经纪人,经纪人会把商演的细节和报酬谈好,再把合同交给明星签. 一.定义 代理模式:为一个对象提供一个代用品或占位符,以便控制对它的访问. 代理分为:保护代理和虚拟代理 保护代理:用于控制不同权限的对象对目标对象的访问,在JavaScript中很难判断谁访问了某个对象,所以保护代理很难实现. 二.图片预加载(最常见的虚拟代理应用场景) 图片预加载是一种常用技术,如果直接给某个img标签节点设置src属性,由于图片过大或者网络不佳,图片的位置往

学习javascript面向对象 理解javascript原型和原型链_javascript技巧

先看一张图,梳理梳理. 一.基本概念 [原型链]每个构造函数都有一个对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.那么,如果原型对象等于另一个原型的实例,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针.如果另一个原型又是另一个原型的实例,那么上述关系依然成立.如此层层递进,就构成了实例与原型的链条.[原型对象]这个对象包含可以由特定类型的所有实例共享的属性和方法.所有引用类型默认都继承了Object,而

学习javascript文件加载优化_javascript技巧

在js引擎部分,我们可以了解到,当渲染引擎解析到script标签时,会将控制权给JS引擎,如果script加载的是外部资源,则需要等待下载完后才能执行. 所以,在这里,我们可以对其进行很多优化工作. 放置在BODY底部 为了让渲染引擎能够及早的将DOM树给渲染出来,我们需要将script放在body的底部,让页面尽早脱离白屏的现象,即会提早触发DOMContentLoaded事件. 但是由于在IOS Safari, Android browser以及IOS webview里面即使你把js脚本放到

关于JavaScript的面向对象和继承有利新手学习_javascript技巧

这是一篇关于JavaScript的面向对象和继承的文章,写于1年前,作者循序渐进,对想学习JavaScript中面向对象的同学来说是很有帮助的,因此试着翻译一下,不妥之处,请指正.原文链接Objects and Inheritance in Javascript 虽然一些Javascript用户可能永远也不需要知道原型或面向对象语言的性质,但是那些来自传统面向对象的语言的开发者使用的时候会发现JavaScript的继承模型非常的奇怪.而不同的JS框架提供了各自的方法来编写类面向对象(class-