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 是 ...
随机推荐
- ECSTORE 关于前台页面DIALOG的调用
在需调用dialog的html页面中插入本段代码. link='<{link app=test ctl=site_test act=abc}>'; var dialog = new Dia ...
- js鼠标滑动图片显示隐藏效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- WebSQL实例记录
<table id="content"> </table> <br> <input type="button" id= ...
- vsftpd 访问 权限控制
vsftpd 重启命令 service vsftpd start|restart|stop vsftpd 关于权限控制,有两个文件分别设置,都会起作用 /etc/vsftpd/user_list / ...
- d039: 点的位置
内容: 已知一平面直角坐标系中正方形的左上(-2,2)和右下(2,-2)的顶点坐标,,当给一个点的坐标,判断点和正方形的关系,在正方形内(含边上)输出True ,否则输出 False 输入说明: 一行 ...
- OC学习篇之---通知(NSNotificationCenter)
在前一篇文章中我们介绍了OC中很常用的两个技术:KVC和KVO: http://blog.csdn.net/jiangwei0910410003/article/details/41912937,今天 ...
- ulimit小结
1. limits是一个进程的资源,会被子进程继承 2. soft limit -S, hard limits -H hard limits只能被root用户修改,启动的时候会加载配置/etc/s ...
- 【转】如何判断CPU是大端还是小端模式
原文网址:http://blog.csdn.net/ysdaniel/article/details/6617458 如何判断CPU是大端还是小端模式 http://blog.sina.com.cn/ ...
- HDU_2011——求多项式的前n项和
Problem Description 多项式的描述如下:1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...现在请你求出该多项式的前n项的和. Input 输入数据由2行组 ...
- Binary Tree Zigzag Level Order Traversal (LeetCode) 层序遍历二叉树
题目描述: Binary Tree Zigzag Level Order Traversal AC Rate: 399/1474 My Submissions Given a binary tree, ...