javascript之Partial Application学习


Posted in Javascript onJanuary 10, 2013

这一次来学习一下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。有兴趣可以读一下它的源码,也是非常简单明了的。

Javascript 相关文章推荐
jQuery学习总结之元素的相对定位和选择器(持续更新)
Apr 26 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
Aug 06 Javascript
jQuery获取radio选中项的值实例
Jun 18 Javascript
JS实现鼠标框选效果完整实例
Jun 20 Javascript
node.js学习之断言assert的使用示例
Sep 28 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
Feb 08 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
Nov 14 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
Nov 20 Javascript
JS实现打砖块游戏
Feb 14 Javascript
微信小程序实现音频文件播放进度的实例代码
Mar 02 Javascript
vue axios请求成功却进入catch的原因分析
Sep 08 Javascript
vue-element-admin项目导入和导出的实现
May 21 Vue.js
javascript之典型高阶函数应用介绍二
Jan 10 #Javascript
javascript之典型高阶函数应用介绍
Jan 10 #Javascript
根据json字符串生成Html的一种方式
Jan 09 #Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
Jan 09 #Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 #Javascript
实现web打印的各种方法介绍及实现代码
Jan 09 #Javascript
js去除重复字符串两种实现方法
Jan 09 #Javascript
You might like
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
PHP获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
PHP入门教程之会话控制技巧(cookie与session)
2016/09/11 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
2010/03/07 Javascript
JS高级笔记
2011/07/13 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
vue实现微信分享链接添加动态参数的方法
2019/04/29 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
Vue组件通信入门之Provide和Inject机制
2019/12/29 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
python生成器generator用法实例分析
2015/06/04 Python
使用Python对SQLite数据库操作
2017/04/06 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
UNIX文件类型
2013/08/29 面试题
办护照工作证明范本
2014/01/14 职场文书
区三好学生主要事迹
2014/01/30 职场文书
文化建设工作方案
2014/05/12 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
欠条格式范本
2015/07/03 职场文书
总经理致辞
2015/07/29 职场文书
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js