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 是 ...
随机推荐
- 使用C#版本GDAL读取复数图像
GDAL的C#版本虽然在很多算法接口没有导出,但是在读写数据中的接口基本上都是完全导出了.使用ReadRaster和WriteRaster方法来进行读写,同时对这两个方法进行了重载,对于常用的数据类型 ...
- FileReader
Reader 字符流的基类,抽象类 FileReader 读取文件的字符流 package file; import java.io.File; import java.io.FileReader; ...
- 递归目录的shell脚本
#! /bin/sh # 在其他目录运行时一定要加上这样的语句 # 尤其是配置在crontab里自动运行 cd `` #定义数据别名 alias statdb="/usr/local/mys ...
- Sicily 1129. ISBN
题目地址:1129. ISBN 思路: 这道题比较简单,只要看懂题目就应该可以了.那就解释下题目好了,题目意思是按照权值计算这10个数字和,依据这个和计算还差多少可以对11整除,若还差10,那么在这个 ...
- PADS Layout将导入DXF,并转换成板框步骤
1.在PADS Layout中选择 Import... 2.选择DXF文件(一般由结构工程师给出),直接点OK即可. 3.导入后,板框图一角视图如下.右键选择 Select Shapes,然后双击外框 ...
- VS2013编译libcurl
首先从这里下载libcurl的package: http://curl.haxx.se/libcurl/ 然后解压,里面有个winbuild文件夹,这里是为windows构建工程的文件夹.里面有nma ...
- 【转】在Ubuntu 12.04 上为Virtualbox 启用USB 设备支持--不错
原文网址:http://www.cnblogs.com/ericsun/archive/2013/06/10/3130679.html 虚拟机我一直在用,不是说离不开Windows,而是有些时候一些应 ...
- Codeforces Round #292 (Div. 1) - B. Drazil and Tiles
B. Drazil and Tiles Drazil created a following problem about putting 1 × 2 tiles into an n × m gri ...
- v4l2采集视频和图片源码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h&g ...
- javaweb笔记之get和post的不同
1 GET方式 1)提交的参数数据会放在请求信息的URL后面.以?开头,多个参数数据以 & 分 割. 2)浏览器的地址会发生改变 3)参数数据的容量不能超过1KB. 4)不适合敏感数据的提交 ...