关于arguments对象以及函数的柯里化;
1、arguments对象
Arguments是个类似数组但不是数组的对象,说他类似数组是因为其具备数组相同的访问性质及方式,能够由arguments[n]来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际 传递给函数的参数,而不局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。在JavaScript中函数不介意传递进来多少参数,也不会因为参数不统一而错误。实际上,函数体内可以通过 arguments 对象来接收传递进来的参数。
function box() {
return arguments.length; //得到 6
} alert(box(1, 2, 3, 4, 5, 6));
我们可以利用 length 这个属性, 来智能的判断有多少参数, 然后把参数进行合理的应用。 比如,要实现一个加法运算,将所有传进来的数字累加,而数字的个数又不确定。
function sum() {
var sum = 0;
if (arguments.length == 0) return sum; //如果没有参数,退出
for (var i = 0; i < arguments.length; i++) {
sum += arguments[i]
}
return sum;
}
console.log(sum(1, 3, 5)) //
arguments对象中有一个非常有用的属性:callee。arguments.callee返回此arguments对象所在的当前函数引用。在使用函数递归调用时推荐使用arguments.callee代替函数名本身。
function count(a) {
if (a == 0) return 1;
return a + arguments.callee(--a); }
var s = count(5)
console.log(s); // 16 == >5+4+3+2+1+1
2、柯里化
在javascript中,函数可以接受多个参数,并且这些参数可以不固定(arguments),而柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
通用实现:
function currying(fn) {
if (typeof fn !== 'function') throw new Error("currying():fn must be function");
var args = [].slice.call(arguments, 1)
return function() {
var newArgs = args.concat([].slice.call(arguments))
return fn.apply(null, newArgs)
}
}
来看一个例子:
function currying(fn) {
//var args = Array.prototype.slice.call(arguments,1)
if (typeof fn !== 'function') throw new Error("currying():fn must be function");
var args = [].slice.call(arguments, 1);
return function() {
var newArgs = args.concat([].slice.call(arguments));
return fn.apply(null, newArgs);
}
}
var getPerson = currying(function() {
var args = [].slice.call(arguments);
console.log(args.toString());
}, "jone")
getPerson('jack', "tome", "eric") // jone,jack,tome,eric
getPerson('张三') // jone,张三
思考题:已知fn为一个预定义函数,实现函数curryIt
var fn = function(a, b, c) {
return a + b + c
};
curryIt(fn)(1)(2)(3); // function curryIt(fn) {
//这里补充
}
可以试着玩一下,这里是用的函数的柯里化
function curryIt(fn) {
if (typeof fn !== 'function') throw new Error("curryIt():fn must be function");
var args = [].slice.call(arguments, 1)
return function() {
args = args.concat([].slice.call(arguments));
if (args.length < fn.length) {
return arguments.callee;
} else {
return fn.apply(null, args)
}
}
}
参考:
http://www.cnblogs.com/pigtail/p/3447660.html
http://www.zhangxinxu.com/wordpress/2013/02/js-currying/
关于arguments对象以及函数的柯里化;的更多相关文章
- js高阶函数--判断数据类型、函数胡柯里化;
一.判断数据类型: 常见的判断有typeof.instanceof. constructor. prototype,先来看typeof: var a = "hello world" ...
- JS 函数的柯里化与反柯里化
===================================== 函数的柯里化与反柯里化 ===================================== [这是一篇比较久之前的总 ...
- 高频重要前端API手写整理(call,apply,bind,instanceof,flat,filter,new,防抖,节流,深浅拷贝,数组乱序,数组去重,继承, lazyman,jsonp的实现,函数的柯里化 )
Function.prototype.call = function(context,...args){ var context = context || window; context.fn = t ...
- 浅析 JavaScript 中的 函数 currying 柯里化
原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...
- Scala_方法、函数、柯里化
方法.函数.柯里化 方法 声明方法: scala> def m1(x:Int,y:Int):Int = { | x + y | }m1: (x: Int, y: Int)Ints ...
- JavaScript函数式编程(纯函数、柯里化以及组合函数)
JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...
- 前端开发者进阶之函数反柯里化unCurrying
函数柯里化,是固定部分参数,返回一个接受剩余参数的函数,也称为部分计算函数,目的是为了缩小适用范围,创建一个针对性更强的函数. 那么反柯里化函数,从字面讲,意义和用法跟函数柯里化相比正好相反,扩大适用 ...
- JavaScript函数的柯里化(currying)
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/currying.html 什么是js函数的currying /柯里化? 说到js的柯里化,相信很多朋友都会头大.或 ...
- 理解运用JS的闭包、高阶函数、柯里化
JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...
随机推荐
- 005windows与Linux文件共享
基于网络的文件共享: 前提一:从windows能够ping通Linux: 前提二:关闭Linux防火墙,命令[/etc/init.d/iptables stop]: 方法一:通过WinSCP 步骤一: ...
- 如何使用CSS3画出一个叮当猫
刚学习了这个案例,然后觉得比较好玩,就练习了一下.然后发现其实也不难,如果你经常使用PS或者Flash的话,应该就会知道画个叮当猫是很容易 的事,至少我是这么觉得.但是,用CSS3画出来确实是第一次接 ...
- .net IL 指令速查
名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...
- 文本处理命令--wc、sed
一.wc wc命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 测试文件内容: (my_python_env)[root@hadoop26 ~]# cat test hnlinu ...
- PHP-You don’t have permissions to access xxx on this server!
问题如下图: 如果你是想要查看目录下的每一个文件,那么你需要修改一下httpd-conf配置文件,也就是apache的配置文件,以phpStudy2013为例,如下图打开: 然后找到如下部分,添加 ...
- PHP错误处理
错误的分类: 1.语法错误 2.运行时错误 3.逻辑错误 调试方法:1.注释法 2.输出法 error_reporting(E_ALL & ~E_NOTICE & ~E_WAR ...
- WinSock编程基础
一.套接字模式 1.阻塞模式 创建套接字时,默认是阻塞模式,对recv函数调用会使程序进入等待状态,知道接收到数据才返回. 2.非阻塞模式: 可以调用ioctlsocke ...
- 生日蛋糕 (codevs 1710) 题解
[问题描述] 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1<=i<=M)层蛋糕是半径为Ri,高度为Hi的圆柱 ...
- javascript arguments
此文为转载文章: 什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments ...
- openerp 常见问题 OpenERP为什么选择了时区后时间还是不对?(转载)
OpenERP为什么选择了时区后时间还是不对? 原文地址:http://cn.openerp.cn/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9%E4%B ...