javascript函数科里化
2015-09-15 18:07
537 查看
函数科里化(Currying)是指是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
下面的这个函数就是函数科里化的一个很好的解释:
上面的就是函数科里化, 当sum()只接收到一个参数的时候,会把这一个函数赋值给x,所以sum(2)返回的是一个函数(该函数的活动对象包括sum的活动对象),
在给所返回的函数传值就,会把传入的值赋值给y,执行函数,返回x+y
下面的函数是一个通用的科里化函数的函数
ps:
1.说明一下arguments.length 与 函数名.length的区别
个人理解: arguments.length是实参的个数,函数名.length是形参个数
2. arguments是类数组对象,所以arguments不继承Array.prototype,没有数组的一些操作方法
3. slice() 数组的操作方法,返回的是数组的一个子集
4. call(null)或者call(undefined) 在非严格模式下,在浏览器中相当于call(window),严格模式下call(null)就是在null下,call(undefined)就是在undefined下; apply、bind同理
ECMAScript 5的bind()方法就可以做到将函数科里化
下面的这个函数就是函数科里化的一个很好的解释:
function sum(x,y) { if (x != undefined && y != undefined) { return x + y; } else if (x != undefined && y == undefined) { console.log("x=" + x); return function(y) { return x + y; } } else { console.log("y=" + y); return function(x) { return x + y; } } } console.log(sum(2,3)); // 5 console.log(sum(2)(3)); // 5(会有console出"x=2") console.log(sum(undefined,10)(90)); // 100(会有console出"y=10")
上面的就是函数科里化, 当sum()只接收到一个参数的时候,会把这一个函数赋值给x,所以sum(2)返回的是一个函数(该函数的活动对象包括sum的活动对象),
在给所返回的函数传值就,会把传入的值赋值给y,执行函数,返回x+y
下面的函数是一个通用的科里化函数的函数
ps:
1.说明一下arguments.length 与 函数名.length的区别
function test(){ console.log(test.length); console.log(arguments.length); } test(10,11);
个人理解: arguments.length是实参的个数,函数名.length是形参个数
2. arguments是类数组对象,所以arguments不继承Array.prototype,没有数组的一些操作方法
3. slice() 数组的操作方法,返回的是数组的一个子集
4. call(null)或者call(undefined) 在非严格模式下,在浏览器中相当于call(window),严格模式下call(null)就是在null下,call(undefined)就是在undefined下; apply、bind同理
function Currying(fun) { return function() { var args = Array.prototype.slice.call(arguments,0); // 为arguments添加一个slice()方法 if (args.length < fun.length) { return function(){ var newargs = args.concat(Array.prototype.slice.call(arguments,0)); return Currying(fun).apply(null,newargs); // 递归使函数的形参和实参个数保持一致 } } else { return fun.apply(undefined,args); // [这里的this在浏览器里是window,node环境下global] // 形参和实参个数一致时执行fun } } } function foo(x,y,z) { console.log(this); console.log(x + y + z); } var test = Currying(foo); test(1)(2)(3); test(2,3)(4);
ECMAScript 5的bind()方法就可以做到将函数科里化
function foo(x,y,z){ console.log(x + y + z); } var fun = foo.bind(this,10); // fun的x已经被绑定为了10 fun(10,10); // 30
相关文章推荐
- JS模块加载
- 页面Loading js插件
- 火星坐标和百度地图坐标相互转换(js实现)
- 绑定事件、阻止默认事件、阻止冒泡
- JavaScript 之arguments、caller 和 callee 介绍
- Javascript 创建对象的七种方法
- javascript中的函数式声明与变量式声明
- js 记忆函数
- js中的继承
- js 判断两个标准时间是不是同一周
- javascript数据缓存
- 网页加载效果(利用图片加载)
- js控制只允许输入数字
- Javascript中this关键字详解
- Cookies vs Tokens. Getting auth right with Angular.JS
- js+flash实现,单击按钮复制文本框内容
- JSTL标签库 fmt标签
- video js Tracks
- JS监听键盘两个组合键触发的事件
- 深入理解Javascript之this关键字