Function Currying in javascript 的一些注释
理解函数柯里化(Function Currying ),最关键的是理解下面这个函数:
function curry(fn){
var args = Array.prototype.slice.call(arguments, 1);
return function(){
var innerArgs = Array.prototype.slice.call(arguments);
var finalArgs = args.concat(innerArgs);
return fn.apply(null, finalArgs);
};
}
//这段代码来自:Professional JavaScript for Web Developers. Third Edition. page741 _
使用示例如下:
function add(num1, num2){
return num1 + num2;
}
var curriedAdd = curry(add, 5);
alert(curriedAdd(3)); //8
下面结合上述使用示例分析一下curry(fn)。
curry(fn)并不复杂,理解curry(fn)首先要知道 javascript 的函数是不会检查自身参数的(详见w3schools)。假如传入函数的参数数量比定义的多,多出来的参数会被忽略掉,不影响函数的执行。但这种忽略不是完全的忽略,这些多出来的参数仍然可以使用 arguments 对象来访问。
在上面的例子中,curry(fn) 只定义的一个参数,但在实际使用中
var curriedAdd = curry(add, 5);
curry 被传入了 add 和 5 两个参数,其中 5 被选择性忽略。
- curry(fn)执行的第一行:
var args = Array.prototype.slice.call(arguments, 1);
就是获取第一个参数后的所有参数,在上述例子中就是[5]。 - 然后再将一个新的函数返回给curriedAdd ,此时curriedAdd 中的 args 和 fn 已经被赋值。
- 再调用curriedAdd(3)的时候,执行的结果如下:
innerArgs = [3]
finalArgs = [5, 3]
最后返回函数 add.apply(null, [5,3])
如果对原来的函数稍加修改,就可以很直观地看到 currying 的整个过程:
function newCurry(fn) {
var args = Array.prototype.slice.call(arguments, 1);
//
console.log('args=>'+args);
console.log('fn=>'+fn);
//
return function() {
var innerArgs = Array.prototype.slice.call(arguments);
var finalArgs = args.concat(innerArgs);
//
console.log('args=>'+args);
console.log('innerArgs=>'+innerArgs);
console.log('finalArgs=>'+finalArgs);
//
return fn.apply(null, finalArgs);
};
};
function add(num1, num2){
return num1 + num2;
}
var curriedAdd = newCurry(add, 5); // "args=>5"
// "fn=>function (num1, num2) {
// return num1+ num2;
// }"
alert(curriedAdd(3)); //"args=>5"
//"innerArgs=>3"
//"finalArgs=>5,3"
//8
几篇关于javascript function currying 的文章:
- Currying in JavaScript
- A Beginner’s Guide to Currying in Functional JavaScript
- Currying and Partial Functions in JavaScript
Function Currying in javascript 的一些注释的更多相关文章
- JavaScript day1(注释)
JavaScript中的注释方式有两种: 单行注释,使用 //. // This is an in-line comment. 多行注释,以/*开始,用*/来结束. /* This is a mult ...
- Javascript——数据类型 和 注释
数据类型:JavaScript中包括如下7种数据类型:字符串.数字.布尔.数组.对象.null.undefined 字符串: 注意:字符串类型的数据需要使用单引号或双引号引起来. 数字: 注意:Jav ...
- how to measure function performance in javascript
how to measure function performance in javascript Performance API Performance Timeline API Navigatio ...
- [Javascript] What is JavaScript Function Currying?
Currying is a core concept of functional programming and a useful tool for any developer's toolbelt. ...
- 如何为javascript代码编写注释以支持智能感知
在使用Visual Studio做开发的时候,智能感知是非常方便的.从VS2008开始,提供了对javascript的智能感知支持.例如 上述代码中,我们先用document对象的getElement ...
- 如何写出优雅的JavaScript代码 ? && 注释
如何写出优雅的JavaScript代码 ? 之前总结过一篇<如何写出优雅的css代码?>, 但是前一段时间发现自己的js代码写的真的很任性,没有任何的优雅可言,于是这里总结以下写js时应当 ...
- JavaScript基础之注释,类型,输出,运算符
JavaScript是一种依托于网页为宿主的脚本语言,JavaScript是一门非常强大的语言,尤其对于web端,用途广泛,好用,偏向于操作网页,可以操作网页中的任何一个元素,JavaScript的缺 ...
- [Javascript] Required function arguments in Javascript
In Javascript, all function arguments are optional by default. That means if you ever forget to pass ...
- JavaScript 变量与注释
一.变量 ECMAScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据. 换句话说,每个变量仅仅是一个用于保存值的占位符而已.定义变量时要使用 var 操作符(注意 var 是 ...
随机推荐
- 解决animate动画连续播放bug
在animate动画中,如果几个div之间频繁切换,会导致鼠标移开后,动画仍在继续,解决方法有两个 一个,判断当前是否在运行动画: if(!$(".block").is(" ...
- memcache分布式小实例
<?php /** * 分布式的 memcache set 实现 */ /** * 创建缓存实现memcache 添加分布式服务器 并设置权限 */ function createCache() ...
- C# 实现将PDF转文本的功能
这篇文章最初只描述使用 PDFBox 来解析PDF文件.现在它已经被扩展到包括使用 IFilter 和 iTextSharp 的例程了. 这篇文章和对应的Visual Studio项目已经更新到目前 ...
- 在at91sam9260处理器上调试linux2.6.33.7的过程
本文脉络: 1.SAM9260处理器介绍,单板机配置. 2.SAM-BA的运行机制与applets的修改. 3.修改bootstrap. 4.内核源码获取与打补丁. 5.基于ubuntu的开发环境搭建 ...
- 几个强大的oracle自带函数,可根据日期算年纪,根据数值匹配字段
select A.USER_NAME, decode(A.SEX, 1, '男', 2, '女')AS SEX, A.HEAD_PORTRAIT, TRUNC(months_between(sysda ...
- Git的思想和基本工作原理
Git的思想和基本工作原理 Chapter: 开始了解Git 1. 先谈谈版本控制的一些事 2. Git诞生背后的一些故事 3. 版本控制:集中式VS分布式 4. Git的思想和基本工作原理 5. G ...
- Coursera获取中文字幕(如果有的话)
字幕的格式是 https://class.coursera.org/${课程代号}/lecture/subtitles?q=${视频编号}_zh-cn 例如 https://class.course ...
- VA自动补全QT
发现用了一下,VA不能把QT的东西进行代码自动补全.于是要动下小手脚. 1.在Windows系统环境变量下增加 QTDIR = 你QT的安装目录. 2启动VS->工具->选项->项目 ...
- vbox端口转发
端口转发:setting->network->adapter:attached to NAT.port forwarding rules->name protocol ...
- 【转】C++读写二进制文件
原文网址:http://blog.csdn.net/lightlater/article/details/6364931 摘要: 使用C++读写二进制文件,在开发中操作的比较频繁,今天有幸找到一篇文章 ...